Tag: 引用类型

结构和类对象数组的内存分配

最后一天我正在阅读C#参考,在那里我看到了一个声明。 请看下面的陈述。 语境: 对于Point使用结构而不是类可以在运行时执行的内存分配数量有很大差异。 下面的程序创建并初始化一个包含100个点的数组。 将Point实现为类,实例化101个单独的对象 – 一个用于数组,一个用于100个元素。 class Point { public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } } class Test { static void Main() { Point[] points = new Point[100]; for (int i = 0; i < 100; i++) points[i] = new Point(i, i*i); […]

哪个更高效,将整个对象或该对象的属性传递给方法?

请考虑以下示例。 我需要检查CouponModel是否有唯一的串行密钥。 我有两个选择: CouponModel model = GetFromSomewhere(); if (!CouponHasUniqueKey(model)) { } //or if (!CouponHasUniqueKey(model.SerialKey)) { } 当然,在我传入整个对象的方法中,我必须访问字符串属性,而不是直接使用字符串。 哪个选项更好,为什么?

为什么Nullable 不匹配作为generics约束的引用类型

可能重复: Nullable类型作为通用参数可能吗? 我遇到了generics类型约束非常奇怪的事情。 我有一个这样的课: public SomeClass where T:class { } 但是,我发现我不能像我期望的那样使用可空类型: new SomeClass(); 我得到一个int?的错误int? 必须是参考类型。 Nullable真的只是一个带有语法糖的结构,使它看起来像一个引用类型吗?

传递引用类型对象并更改值

我试图将引用类型对象传递给方法并从那里更改它。 当我更改它时,我没有对传递给方法的变量进行更改。 这是一个例子: public interface IPerson { string Name { get; } } public class Teacher : IPerson { public string Name { get; set; } public string LastName { get; set; } } //…… public void CreateTeacher(IPerson teacher) { teacher = new Teacher() { Name = “Teacher name”, LastName = “Teacher’s last name”}; } […]

事件参数是通过C#中的引用还是值传递的?

一个相当简单的问题(我认为),但我似乎没有看到答案。 我知道有些值是通过值传递的(比如int和long),而其他值是通过引用传递的(比如字符串),当你将它们传递给函数时。 在我的程序中,我使用后台工作程序,以便在我们在后台执行长时间的过程时GUI不会锁定。 我需要将数据从另一个文件传递回UI线程,所以我一直在使用事件。 现在我需要将一个字符串数组列表发送回GUI线程来处理,我担心它将如何处理。 基本上,在工作线程中,我有一个循环,它将填充列表,通过事件处理程序将其发送回GUI,然后清除它,以便它可以在下一次循环中填充它并重新开始。 我担心当我这样做时,如果列表是通过引用传递的,那么在UI线程上,我会认为它会在读取中间清除,因为工作线程仍将在后台清除它。 在这种情况下,传递将是更可取的,我可以找到强制它的方法(复制到某个持有者数组或添加互斥体或类似的东西),但我认为知道事件参数是否通过传递是很好的一般的引用或值,或者它与方法是否相同,并且它会在通常传递参数时传递它们?

接口变量是否具有值类型或引用类型语义?

接口变量是否具有值类型或引用类型语义? 接口按类型实现,这些类型是值类型或引用类型。 显然, int和string实现IComparable , int是值类型, string是引用类型。 但是这个怎么样: IComparable x = 42; IComparable y = “Hello, World!”; (我试图回答的问题可能被删除了,因为它询问接口是存储在堆栈还是堆上,而且,正如我们都应该知道的那样,考虑到它们之间的值和引用类型之间的差异更具建设性。语义而不是它们的实现。有关讨论,请参阅Eric Lippert的堆栈是一个实现细节 。)

如何/为什么值类型可以从引用类型派生?

在.NET ,所有值类型都从名为System.ValueType的类inheritance。 System.ValueType是一个类,因此它是一个reference type 。 我的问题是value type如何以及为什么可能从reference type派生?

是否可以创建一个接受(可空)值类型和引用类型的C#generics方法?

我想创建一个接受值类型和引用类型参数的简单方法,即int是value,string是reference。 所以这就是我的开始: public bool areBothNotNull(T? p1, T? p2) { return (p1.HasValue && p2.HasValue); } 所以我希望能够像这样使用它: var r1 = areBothNotNull(3, 4); // will be true var r2 = areBothNotNull(3, null); // will be false var r3 = areBothNotNull(“three”, “four”); // will be true var r4 = areBothNotNull(null, “four”); // will be false 但我遇到的第一个问题是 类型’T’必须是不可为空的值类型,以便在generics类型或方法’System.Nullable’中将其用作参数’T’ 为了继续,我向我的方法添加一个struct约束 public […]

C#按值传递而不是按引用传递

考虑以下代码(我有意将 MyPoint编写为此示例的引用类型) public class MyPoint { public int x; public int y; } 它是普遍公认的(至少在C#中)当你通过引用传递时,该方法包含对被操作对象的引用,而当你通过值传递时,该方法复制被操纵的值,因此全局范围中的值是不受影响。 例: void Replace(T a, T b) { a = b; } int a = 1; int b = 2; Replace(a, b); // a and b remain unaffected in global scope since a and b are value types. 这是我的问题; MyPoint是一个引用类型,因此我希望Point上的相同操作在全局范围内替换a和b 。 例: […]