草庐IT

c# - 值类型的引用相等性

我做了一些ref关键字测试,但有一件事我无法理解:staticvoidTest(refinta,refintb){Console.WriteLine(Int32.ReferenceEquals(a,b));}staticvoidMain(string[]args){inta=4;Test(refa,refa);Console.ReadLine();}为什么这段代码显示False?我知道int是一个值类型,但在这里它应该传递对同一对象的引用。 最佳答案 WhydoesthiscodedisplayFalse?因为inta和intbar

c# - 什么时候使用 C# ref 关键字是个好主意?

我在生产代码中看到ref使用的次数越多,我遇到的误用就越多,给我带来的痛苦也就越多。我开始讨厌这个关键字,因为从构建框架的角度来看,它似乎很愚蠢。什么时候向您的代码用户传达可能从他们下面更改对象引用/值的概念是个好主意?相比之下,我喜欢关键字,而且我更喜欢根本不使用关键字的情况,在这两种情况下都是因为您在使用关键字时得到了保证。另一方面,Ref不做任何保证,除非您在传入参数之前必须对其进行初始化,即使它可能没有任何更改。虽然我不是圣人开发者;我确信它具有实际适用的用途。我只想知道它们是什么。 最佳答案 FrameworkDesign

c# - 什么时候使用 C# ref 关键字是个好主意?

我在生产代码中看到ref使用的次数越多,我遇到的误用就越多,给我带来的痛苦也就越多。我开始讨厌这个关键字,因为从构建框架的角度来看,它似乎很愚蠢。什么时候向您的代码用户传达可能从他们下面更改对象引用/值的概念是个好主意?相比之下,我喜欢关键字,而且我更喜欢根本不使用关键字的情况,在这两种情况下都是因为您在使用关键字时得到了保证。另一方面,Ref不做任何保证,除非您在传入参数之前必须对其进行初始化,即使它可能没有任何更改。虽然我不是圣人开发者;我确信它具有实际适用的用途。我只想知道它们是什么。 最佳答案 FrameworkDesign

c# - 行动委托(delegate)< ref T1, T2>

我正在尝试创建一个采用ref参数的静态方法的委托(delegate)。请不要问我为什么要这样做。这都是学习.Net、C#和反射如何工作以及如何对其进行优化的一部分。我的代码是:publicstructDataRow{privatedoublet;staticpublicvoidCram_T(refDataRowdr,doublea_t){dr.t=a_t;}}''''TypemyType=typeof(DataRow);MethodInfomy_Cram_T_Method=myType.GetMethod("Cram_T");varmyCram_T_Delegate=Delegate.

c# - 行动委托(delegate)< ref T1, T2>

我正在尝试创建一个采用ref参数的静态方法的委托(delegate)。请不要问我为什么要这样做。这都是学习.Net、C#和反射如何工作以及如何对其进行优化的一部分。我的代码是:publicstructDataRow{privatedoublet;staticpublicvoidCram_T(refDataRowdr,doublea_t){dr.t=a_t;}}''''TypemyType=typeof(DataRow);MethodInfomy_Cram_T_Method=myType.GetMethod("Cram_T");varmyCram_T_Delegate=Delegate.

c# - 我应该使用 "ref"通过引用方法来传递集合(例如 List)吗?

我应该使用“ref”通过对方法的引用来传递列表变量吗?是否不需要“ref”的答案(因为列表将是一个引用变量),但是为了便于阅读,将“ref”放入? 最佳答案 字典是引用类型,所以不可能按值传递,尽管对字典的引用是值。让我试着澄清一下:voidMethod1(Dictionarydict){dict["a"]="b";dict=newDictionary();}voidMethod2(refDictionarydict){dict["e"]="f";dict=newDictionary();}publicvoidMain(){varm

c# - 我应该使用 "ref"通过引用方法来传递集合(例如 List)吗?

我应该使用“ref”通过对方法的引用来传递列表变量吗?是否不需要“ref”的答案(因为列表将是一个引用变量),但是为了便于阅读,将“ref”放入? 最佳答案 字典是引用类型,所以不可能按值传递,尽管对字典的引用是值。让我试着澄清一下:voidMethod1(Dictionarydict){dict["a"]="b";dict=newDictionary();}voidMethod2(refDictionarydict){dict["e"]="f";dict=newDictionary();}publicvoidMain(){varm

C# 不能在匿名方法体内使用 ref 或 out 参数

我正在尝试创建一个函数,该函数可以创建一个Action,该Action会递增传入的任何整数。但是我的第一次尝试是给我一个错误“无法在匿名方法体内使用ref或out参数”。publicstaticclassIntEx{publicstaticActionCreateIncrementer(refintreference){return()=>{reference+=1;};}}我理解为什么编译器不喜欢这样,但我仍然希望有一种优雅的方式来提供一个可以指向任何整数的漂亮的增量器工厂。我看到执行此操作的唯一方法如下所示:publicstaticclassIntEx{publicstaticAc

C# 不能在匿名方法体内使用 ref 或 out 参数

我正在尝试创建一个函数,该函数可以创建一个Action,该Action会递增传入的任何整数。但是我的第一次尝试是给我一个错误“无法在匿名方法体内使用ref或out参数”。publicstaticclassIntEx{publicstaticActionCreateIncrementer(refintreference){return()=>{reference+=1;};}}我理解为什么编译器不喜欢这样,但我仍然希望有一种优雅的方式来提供一个可以指向任何整数的漂亮的增量器工厂。我看到执行此操作的唯一方法如下所示:publicstaticclassIntEx{publicstaticAc

c# - 异步方法中的 ref 和 out 参数

有谁知道为什么async方法不允许有ref和out参数?我对此做了一些研究,但我唯一能找到的是它与堆栈展开有关。 最佳答案 Doesanyoneknowwhyasyncmethodsarenotallowedtohaverefandoutarguments?当然。想一想-异步方法通常几乎立即返回,远在大多数实际逻辑执行之前......这是异步完成的。所以任何out必须在第一个await之前分配参数表达式,并且很可能必须对ref进行一些限制参数以阻止它们在第一个await之后被使用无论如何表达,因为在那之后它们甚至可能无效。考虑使用o