在C#中使用ref
我正在尝试编写一个基本程序,其中有两个类.我可以通过一个类来罚款: public static void Main (string[] args) { double radius; double height; double volume; { System.Console.WriteLine ("Enter radius"); radius = double.Parse(System.Console.ReadLine()); System.Console.WriteLine (radius); System.Console.WriteLine ("Enter height"); height = double.Parse(System.Console.ReadLine());
14 2024-04-26
编程技术问答社区
变态。有什么办法可以在C#中原生地使用带有lambdas的引用吗?
我有一些变量,这些变量是通过ref关键字给出的.我想在lambda表达式中使用ref-Variables,而无需完全使用局部变量. 我知道C#无法合并lambdas和Ref-variables.但是,没有任何使ref-variables在lambda-expression中起作用的变态吗? 伪代码(Wannay-Be C#): T MyFunction(ref T x, ref T y) { return (Func) ( () => ( (100 * (x - y)) / x ) (); } 我想要它: 1).是通用的. 2).接受作为参数,通过参考. 3).使用两个选项使其与lambdas一起使用. 4).使用通用. 返回结果 5).成为有机编程代码:)笑话. 并致电SMTH.这样: int x = 21, y = 9; int result = MyFunction(ref x, re
38 2024-04-25
编程技术问答社区
C# Reflection Call Method with ref/Pointer Parameter
我想用反射来调用类的每种方法,但我无法用指针作为参考调用方法.通常,我发现我发现的每个指针都可以通过null,一切都会好起来的.问题是当功能访问我传递的指针时.指针将是对内存地址0的引用,这显然是我程序的即时崩溃. 因此,我需要将指针传递给有效的内存adress,但是我不知道如何在运行时创建指针 我的代码的压缩版: class Program { static void Main(string[] args) { var obj = new TestClass(); var pointerMethod = obj.GetType().GetMethod("Test"); var referenceMethod = obj.GetType().GetMethod("Test2"); var pointerParameter = pointerMethod.GetParameters()[0];
20 2024-04-22
编程技术问答社区
我怎样才能发射一个返回引用的动态方法?
我正在浏览ref Return的来龙去脉,并且在发出动态方法时遇到了不错的回报. 手工制作的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; } ,但是发出动态方法失败. 注意:我正在使用WidgetMeasurer GetMeasurerC() { FieldInfo lengthField = typeof(Widget).GetField(nameof(Widg
20 2024-04-19
编程技术问答社区
在C#8中,我可以在不复制元素的情况下对一个结构数组进行取数吗?
使用新的我确实在结构阵列上有一些foreach迭代,并且根据此答案,这意味着在迭代数组时复制每个元素. 我以为我现在可以简单地修改代码以防止复制,例如: // Example struct, real structs may be even bigger than 32 bytes. struct Color { public int R; public int G; public int B; public int A; } class Program { static void Main() { Color[] colors = new Color[128]; foreach (ref readonly Color color in ref colors) // note 'ref readonly' placed here Debug.WriteLine($"Col
14 2024-04-19
编程技术问答社区
更新匿名方法中的参考参数
是否有解决方法可以更新匿名方法中的ref参数? 我知道,匿名方法不允许访问外部范围的参数,但是还有另一种方法吗?我正在使用外部库作为Messagestream,因此无法更改代表的参数... void DoWork(ref int count) { MessageStream Stream = new MessageStream(); Stream.MessageReceived += (o, args) => { //Error cannot use ref or out parameter inside anonymous method count++; }; } 解决方案 在您的情况下,此问题没有可行的工作:到Stream.MessageReceived事件触发时,count可能会超出您的DoWork函数呼叫者的范围. 在这样的情况下,您应该将count封装在一个对象中,并在事件处理程序和呼叫者中
6 2024-04-19
编程技术问答社区
滥用裁判权。值得清理?
我继承了一些代码,这些代码广泛,不必要地使用了 ref .如果不使用 ref ,则原始开发人员显然会像原始类型一样克隆,并且不使用原始类型,并且在编写50k+ code行之前不会费心研究该问题. . 这与其他不良的编码实践相结合,造成了一些在表面上荒谬危险的情况.例如: Customer person = NextInLine(); //person is Alice person.DataBackend.ChangeAddress(ref person, newAddress); //person could now be Bob, Eve, or null 您能想象走进商店更改地址,然后走出一个完全不同的人吗? 可怕,但在实践中 在此应用程序中使用 ref 似乎无害多余.我很难证明清理它所需的大量时间.为了帮助出售这个想法,我提出了以下问题: 其他不必要的裁判使用如何破坏性? 我特别关注维护.具有示例的合理答案是首选. 您也欢迎您争辩清理.
14 2024-04-18
编程技术问答社区
为什么只读字段可以通过引用参数来修改?
考虑: class Foo { private readonly string _value; public Foo() { Bar(ref _value); } private void Bar(ref string value) { value = "hello world"; } public string Value { get { return _value; } } } // ... var foo = new Foo(); Console.WriteLine(foo.Value); // "hello world" 尽管如此,这甚至如何起作用?我不应该将不同的值分配给构造函数外部的_value字段,因为它标有readonly.但是,通过ref将其传递给一种方法,并且确实可以操纵. 这是危险的吗?为什么?对我来说这是错误的,
10 2024-04-18
编程技术问答社区
在C#中,你在参数前面的哪里使用 "ref"?
已经有许多问题,关于" ref"和" out"参数的定义,但看起来像是不良的设计.您是否认为Ref是正确的解决方案? 看来您总是可以做其他更干净的事情.有人可以给我一个例子,说明这将是问题的"最佳"解决方案? 解决方案 我认为,ref在很大程度上弥补了宣布新的公用事业类型的困难以及"将信息介绍"到现有信息的困难,这是C#自从其Geneses以来就采取了巨大步骤通过LINQ,Generics和Anonymous类型. 所以不,我认为再也没有很多清晰的用例了.我认为这主要是该语言最初设计的遗物. 我确实认为在您需要从函数和返回值返回某种错误代码的情况下,它仍然是有道理的(如上所述)真的是合理的.)如果我在项目中都在整个地方进行此操作,我可能会为Thing-Plus-Error-Code定义一些通用包装类型,但是在任何给定的实例ref和out中都可以. 其他解决方案 好吧,ref通常用于专业案例,但我不会称其为冗余或C#的遗留功能.例如,您会在XNA中看到它(和o
6 2024-04-18
编程技术问答社区
使用out和ref参数时的装箱和拆箱
当方法接受valueType的out/ref参数时,拳击/拆箱是否会发生? 解决方案 对于ref关键字已在 msdn 那: 不要将通过参考传递的概念与参考类型的概念混淆.这两个概念不一样.无论是值类型还是参考类型,Ref都可以修改方法参数.通过引用传递时,没有值类型. 至于out关键字: out 关键字导致通过参考传递的参数.这是,例如 ref 关键字,除了ref要求在传递变量之前初始化该变量.
10 2024-04-17
编程技术问答社区
C# ref是像C/C++中的指针还是C++中的引用?
我正在使用ref,但不明确地理解"它像指针一样,就像在C/C ++中一样,还是像C ++中的参考?" 为什么我要问一个如此弱的问题? 因为,当我阅读C#/.网书,MSDN或与C#交谈时,我会因以下原因感到困惑: c#开发人员建议不要在功能的论点中使用ref,e.g. ...(ref Type someObject)对他们来说味道不好,他们建议...(Type someObject),我真的不明确地理解这一建议.我听到的原因是:最好与对象的副本一起工作,然后将其用作返回值,而不是通过引用等待损坏内存等...通常我会听到有关数据库连接对象的这样的解释.就像在我的C/C ++经验上一样,我真的不明白为什么使用参考是C#中的坏事?我控制对象的寿命及其内存分配/重新分配等...我在书籍和论坛中阅读仅建议it's bad, because you can corrupt your connection and cause a memory leak by a reference lose
38 2024-04-17
编程技术问答社区
为什么迭代器方法不能接受'ref'或'out'参数?
我今天早些时候尝试过: public interface IFoo { IEnumerable GetItems_A( ref int somethingElse ); IEnumerable GetItems_B( ref int somethingElse ); } public class Bar : IFoo { public IEnumerable GetItems_A( ref int somethingElse ) { // Ok... } public IEnumerable GetItems_B( ref int somethingElse ) { yield return 7; // CS1623: Iterators cannot have ref or out parameters } }
14 2024-04-17
编程技术问答社区
通过引用传入对象
有什么区别 public function Foo(ref Bar bar) { bar.Prop = 1; } public function Foo(Bar bar) { bar.Prop = 1; } 本质上," ref"的意义是什么.不是总是通过引用的对象吗? 解决方案 重点是您从未真正通过对象.您通过参考 - 可以通过参考或值传递参数本身.如果您更改参数值本身,例如将其设置为null或其他参考.使用ref,此更改会影响呼叫者的变量;没有ref,它只是通过的值的 copy ,因此呼叫者看不到其变量的任何更改. 请参阅我关于参数传递的文章有关更多详细信息. 其他解决方案 是.但是,如果您要这样做: public function Foo(ref Bar bar) { bar = new Bar(); } public function Foo(Bar bar) { bar = new Bar(); } 然后您会看到
8 2024-04-16
编程技术问答社区
为什么C#中的数组参数会使用ref?
我阅读了页面 使用ref and cop and out(c#编程)指南) ,并且想知道为什么当它已经是参考类型时,我们需要将数组参数定义为REF参数. Callee函数的更改不会反映在呼叫者函数中吗? 解决方案 不会在呼叫者函数中反映Callee函数的更改? 对数组的目录的更改将反映在呼叫者方法中 - 但是对参数本身的更改不会.因此: public void Foo(int[] x) { // The effect of this line is visible to the caller x[0] = 10; // This line is pointless x = new int[] { 20 }; } ... int[] original = new int[10]; Foo(original); Console.WriteLine(original[0]); // Prints 10 现在,如果我们更改了Foo的签
16 2024-04-15
编程技术问答社区
为什么在声明和调用中都需要使用 ref 关键字?
重复的:呼叫者的" out"关键字的目的是什么? 为什么我需要在声明和呼叫中使用'ref'关键字. void foo(ref int i) { } 例如,考虑上述功能.如果我在没有参考关键字的情况下称其为 foo(k); 它会给我错误: 参数'1'必须与 'ref'关键字 为什么仅在方法签名中指定是否足够? 解决方案 这是因为ref表示应通过参考传递参数.它像C ++中的指针 例如; void CalFoo() { var i=10; foo(ref i); //i=11 } void foo(ref int i) { i++; } 但是 void CalFoo() { var i=10; foo(i); //i=10 } void foo(int i) { i++; } 我认为您可以在一个类中同时拥有foo(ref int)和foo(int).因此,如果您不指定ref ..编译器如
12 2024-04-15
编程技术问答社区
使用ref传递引用类型是否会节省内存?
在C#中,方法的参数可以是参考类型或值类型.传递参考类型时,将传递参考的副本.这样,如果在一种方法内,我们尝试重新分配传递的引用到另一个对象实例,则在方法之外,重新分配不可见. 为了使此工作,C#具有REF修饰符.带有REF的参考类型实际使用原始参考而不是副本. (如果我错了,请纠正我). 在这种情况下,由于我们没有创建参考文献的副本,所以我们保存了任何内存吗?如果一种方法被广泛调用,是否可以改善应用程序的整体性能? 谢谢! 解决方案 索赔 不,不是.如果有的话,由于额外的查找而慢. 没有理由通过参考传递参考类型,除非您特别打算以后分配. 证明 由于有些人似乎认为编译器通过"变量本身",请查看此代码的拆卸: using System; static class Program { static void Test(ref object o) { GC.KeepAlive(o); } static void Mai
14 2024-04-15
编程技术问答社区
在C#中使用REF和OUT关键字进行引用传递和按值传递
这是我到目前为止了解的: 通过Value 通过 按值传递意味着传递参数的副本. 该副本的更改不会更改原始. 通过参考 通过 通过参考,表示对原始的引用. 参考的更改会影响原始. 参考关键字 ref告诉编译器,在输入函数之前,对象是初始化的. 参考意味着已经设置了该值,因此该方法可以读取并对其进行修改. 裁判是两种方式,无论是在内外. 关键字 out告诉编译器,该对象将在函数内部进行INTIAL. 输出意味着该值尚未设置,因此必须在调用返回之前设置. 是一种方法 问题 因此,在哪些情况下,您将使用参考文献的使用和输出关键字与参考或按值传递? 示例将极大地帮助. 非常感谢. 解决方案 您将在1个参数上永远不会组合ref和out.他们俩的意思是"通过参考". 您当然可以将REF参数和OUT参数组合在一种方法中. ref和out之间的差异主要在于意图. REF信号2向数据传输,意味着1向. 但是,除了意图外,C
14 2024-04-15
编程技术问答社区
C#中的ref和out与C++中的指针一样吗?
我只是在C#中做了一个掉期例程: static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } 它做同样的事情,该C ++代码也是如此: void swap(int *d1, int *d2) { int temp=*d1; *d1=*d2; *d2=temp; } 因此 解决方案 它们更有限.您可以在指针上说++,但不能在ref或out上说. 编辑评论中有些混乱,因此可以绝对清楚:这里的重点是与指针的能力进行比较.您不能在ref/out上执行与ptr++的操作,即使其在内存中的相邻位置地址.您可以执行相当于(*ptr)++的同等(但在这里与之无关),但这是将其与 values 的功能进行比较,而不是指针. 安全赌注是它们内部只是指针,因为堆栈不会被移动,并且C#仔细组织了ref和out始终是指堆栈的活动区域. e
28 2024-04-15
编程技术问答社区
在foreach中使用ref的替代方案?
我有一个带有签名的修改方法,例如 private bool Modify(ref MyClass obj); 将对obj进行修改并表示其返回值的成功. Modify不是重新分配参考(我知道这是行不通的),只是修改实例字段,所以我想使用它来执行以下操作: foreach(MyClass obj in myList) { bool success = Modify(obj); // do things depending on success } 我正在遇到问题,因为obj"没有使用ref关键字传递".但是,如果我将Ref关键字放在类似的情况下: bool success = Modify(ref obj); 我得到"不能将obj用作ref/out,因为它是'foreach迭代变量".我知道foreach使用了不变的迭代器,这就是为什么它不起作用. 我的问题是使这样的事情最简单的选择是什么? 我尝试使用 foreach(int
20 2024-04-14
编程技术问答社区