Tag: ref

取消订阅通过ref关键字传递给委托方法的委托?

我有以下课程: public class Terminal : IDisposable { readonly List _listeners; public Terminal(IEnumerable listeners) { _listeners = new List(listeners); } public void Subscribe(ref Action source) { source += Broadcast; //Store the reference somehow? } void Broadcast(string message) { foreach (var listener in _listeners) listener.Listen(message); } public void Dispose() { //Unsubscribe from all the stored sources? } […]

使用ref参数委派

有没有办法在下面的代码中保持相同的function,但无需创建委托? 我正在与包含许多各种DeleteSomethingX(ref IntPtr ptr)方法的第三方API接口,我正在尝试集中IntPtr.Zero检查的代码。 private void delegate CleanupDelegate(ref IntPtr ptr); … private void Cleanup(ref IntPtr ptr, CleanupDelegate cleanup) { if (ptr != IntPtr.Zero) { cleanup(ref ptr); } }

如何发出返回ref的动态方法?

我正在浏览ref返回的来龙去脉,并且无法发出一个由ref返回的动态方法。 手工制作的lambdas和现有方法按预期工作: class Widget { public int Length; } delegate ref int WidgetMeasurer(Widget w); WidgetMeasurer GetMeasurerA() { return w => ref w.Length; } static ref int MeasureWidget(Widget w) => ref w.Length; WidgetMeasurer GetMeasurerB() { return MeasureWidget; } 但是发出动态方法失败了。 注意 :我在这里使用Sigil 。 道歉,我对System.Reflection.Emit不太熟悉。 WidgetMeasurer GetMeasurerC() { FieldInfo lengthField = typeof(Widget).GetField(nameof(Widget.Length)); var emitter = Emit.NewDynamicMethod() .LoadArgument(0) .LoadFieldAddress(lengthField) […]

参考滥用:值得清理?

我inheritance了一些广泛且不必要地使用ref关键字的代码。 如果不使用ref ,原始开发人员显然担心对象会被克隆为原始类型,并且在编写50k +代码行之前没有费心去研究这个问题。 这与其他不良编码实践相结合,已经创造了一些表面上非常危险的情况。 例如: Customer person = NextInLine(); //person is Alice person.DataBackend.ChangeAddress(ref person, newAddress); //person could now be Bob, Eve, or null 你能想象走进商店改变你的地址,走出一个完全不同的人吗? 可怕,但在实践中,在这个应用程序中使用ref似乎是无害的多余。 我无法certificate清理它需要花费大量时间。 为了帮助推销这个想法,我提出了以下问题: 如何不必要地使用ref是破坏性的? 我特别关心维护。 具有示例的合理答案是优选的。 我们也欢迎你争辩说没有必要进行清理。

ref为变量而不是函数中的参数

假设我有一个Person类并具有以下内容: Person A = new Person(“Tom”); Person B = A; 有没有办法可以改变它,这样如果我给B分配一个新人, B = new Person(“Harry”) , A也会指同一个实例? 我知道你可以在函数中的ref参数赋值中做到这一点。

在C#中,你在哪里使用参数前面的“ref”?

关于“ref”和“out”参数的定义已经存在许多问题,但它们看起来像是糟糕的设计。 您是否认为ref是正确的解决方案? 看起来你总能做一些更干净的事情。 有人能给我一个例子,说明这将成为问题的“最佳”解决方案吗?

通过ref 传递List

可能重复: 通过ref传递对象 使用下面的代码,输出将是: Without: With:1 码: static void Main(string[] args) { var listWithoutRef = new List(); WithoutRef(listWithoutRef); Console.WriteLine(“Without:” + string.Join(” “, listWithoutRef)); var listWithRef = new List(); WithRef(ref listWithRef); Console.WriteLine(“With:” + string.Join(” “, listWithRef)); } static void WithoutRef(List inList) { inList = new List(new int[] { 1 }); } static void WithRef(ref List inList) { […]

使用REF和OUT关键字在C#中按值传递和传递值

这是我到目前为止所理解的: 通过价值 按值传递意味着传递参数的副本。 对该副本的更改不会更改原始副本。 通过参考 通过引用传递意味着传递对原始的引用。 对引用的更改会影响原始引用。 REF关键字 REF告诉编译器在进入函数之前初始化对象。 REF表示该值已经设置,因此该方法可以读取并修改它。 REF有两种方式,包括进出。 OUT关键字 OUT告诉编译器该对象将在函数内初始化。 OUT表示该值尚未设置,因此必须在调用return之前设置。 OUT只是一种方式,即出局。 题 那么在什么情况下你会结合使用ref和out关键字,通过引用传递还是通过值传递? 例子会有很大帮助。 非常感谢。

“ref”使用的实际例子

我正在努力如何在真正的应用程序中使用“ref”(通过引用传递参数)。 我想有一个简单而有意义的例子。 到目前为止我发现的所有内容都可以通过向方法添加返回类型来轻松重做。 有人在想吗? 谢谢!

是否可以使用params关键字通过ref传递对象?

我想通过ref将一些参数传递给一个方法,但我不知道参数的数量。 我尝试过类似的东西,但它不起作用:D: public void myMethod(ref params object args) 我会考虑在params中传递指针,但它在C#中有点复杂:/ / 可能的解决方法? 编辑: 我想封装一部分代码,基本上是这样的: …. var collectionA = new List(); var myObject = // an object Optimizer.Optimize(ref collectionA, ref myObject); // cache //{ MaClass.Treatment(); // use collectionA stored in cache via Optimizer // the collectionA is modified in MaClass.Treatment() … //} Optimizer.EndOptimize(); … 目标,如果调用封装到我的优化器中,则不能一直请求我的服务器进行相同的处理(HTTPRequest)