Tag: reference type

如何创建可选的DateTime参数?

我有这个函数返回一个引用类型。 现在,这个函数有两个可选参数,它们都是DateTime类的实例。 function是这样的: public DateTime GetDate(DateTime start = DateTime.MinValue, DateTime end = DateTime.MinValue) { // Method body… } VS的错误是: ‘start’的默认参数值必须是编译时常量 当然,错误适用于第二个参数,我完全理解发生了什么。 我真正想要的是知道是否有办法解决这个问题,即在方法中有可选参数。 现在,我所做的就是创造一个过载; 我的意思是,我创建了一个无参数函数GetDate()和它的双参数重载。 这不是一个真正的问题,但我只是想知道是否有办法做到这一点。

Enumerable.Repeat用于引用类型对象的初始化

我有一个关于Enumerable.Repeat函数的问题。 如果我有课: class A { //code } 我将创建一个该类型对象的数组: A [] arr = new A[50]; 接下来,我将要初始化这些对象,调用Enumerable.Repeat: arr = Enumerable.Repeat(new A(), 50); 这些对象在内存中是否具有相同的地址? 如果我想检查他们的哈希码,例如以这种方式: bool theSameHashCode = questions[0].GetHashCode() == questions[1].GetHashCode(); 这将返回true,如果我将更改一个对象属性,则所有其他对象也将更改它。 所以我的问题是:是否正确地初始化引用类型对象? 如果没有,那么更好的方法是什么?

Dictionary.ContainsKey() – 它是如何工作的?

我已经阅读了关于Dictionary.ContainsKey()如何工作的MSDN文档,但我想知道它是如何实际进行相等比较的? 基本上,我有一个键入引用类型*的字典,我希望ContainsKey()方法检查该引用类型的某个属性作为确定密钥是否存在的基础。 例如,如果我有一个Dictionary(MyObject, int)并且MyObject有一个名为“TypeID”的公共属性( int ),我是否可以获取ContainsKey(MyObject myObject)以检查其中一个键是否具有TypeID等于myObject ? 我可以重载==运算符吗? 引用类型是一个名为“Duration”的对象,它保存一个值( double Length ); “持续时间”是我的音乐节目中使用的基本类型,表示特定声音持续多长时间。 我从中派生出类,其中包含更复杂的时序概念,如西方音乐时间签名,但希望所有这些概念在长度方面具有可比性。 编辑:正如所建议的,我在我的对象上实现了IEquitable,如下所示: public class Duration : IEquatable { protected double _length; /// /// Gets or Sets the duration in Miliseconds. /// public virtual double Length { get { return _length; } set { _length = value; } } // removed all […]

值类型与参考类型的实例化和初始化

int number = new int(); 问题: 对于引用类型, new运算符通过在堆上分配内存来创建该类型的实例,然后通过调用类型的构造函数对其进行初始化。 如上所示,您可以对值类型执行相同操作。 对我来说,上面的行意味着调用构造函数int()以使用值初始化数字 。 我已经读过int是一个指向struct System.Int32的关键字。 因此,在Visual Studio中,我导航到结构Int32。 瞧,没有构造函数存在。 如果没有构造函数,这个预定义类型究竟是如何初始化为0的? 与上面相关,Int32结构中是否有一个存储值的字段? 对于自定义结构和类,我都可以使用new关键字创建新实例,而实际上不包含构造函数的结构或类。 在这种情况下,是否在struct / class包含的所有字段中都没有进行初始化? 唯一的事情就是在堆/堆上为值/引用类型分配内存? 最后,对于值类型,实例化和初始化不需要新的关键字。 这究竟是如何在较低级别上工作的? 假设我们做int number = 5; 。 它以某种方式转换为int a = new int(); a = 5; ? 如果是这样,怎么样? 太感谢了!

如何创建命名引用类型元组?

以下行创建一个命名的ValueTuple : var tuple = (a:1, b:2, c:3, d:4, e:5, f:6); 值类型无法有效传递。 C#7是否提供了一种创建元Tuple类型的命名元组的方法?

为什么结构中的引用类型的行为类似于值类型?

我是C#编程的初学者。 我现在正在研究strings , structs , value types和reference types 。 作为此处和此处接受的答案, strings是引用类型,其指针存储在堆栈上,而它们的实际内容存储在堆上。 此外,如此处所声明的, structs是值类型。 现在我尝试使用一个小例子练习structs和strings : struct Person { public string name; } class Program { static void Main(string[] args) { Person person_1 = new Person(); person_1.name = “Person 1”; Person person_2 = person_1; person_2.name = “Person 2”; Console.WriteLine(person_1.name); Console.WriteLine(person_2.name); } } 上面的代码片段输出 Person 1 Person […]

可变的值类型包装器,传递给迭代器

我正在编写一个需要传递可变整数的迭代器。 public IEnumerable Foo(ref int valueThatMeansSomething) { // Stuff yield return …; } 这让我知道“错误476迭代器不能有ref或out参数”。 我需要的是在迭代器中修改这个整数值,并由迭代器的调用者使用。 换句话说,无论上面的调用Foo()想要知道valueThatMeansSomething和Foo()的结束值都可以使用它本身。 真的,我想要一个引用类型的整数,而不是值类型。 我唯一能想到的是写一个封装了我的整数的类,允许我修改它。 public class ValueWrapper where T : struct { public ValueWrapper(T item) { this.Item = item; } public T Item { get; set; } } 所以: ValueWrapper w = new ValueWrapper(0); foreach(T item in Foo(w)) { // Do […]

是int吗? 值类型或引用类型?

这个问题更多的是关于添加? 一个值类型比关于int? 在C#中, int是值类型。 是int? 值类型或引用类型? 在我看来,它应该是一个引用类型,因为它可以为null 。

为什么Microsoft建议跳过为引用类型实现相等运算符?

根据MSDN : 大多数引用类型不能重载相等运算符,即使它们重写等于。 但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则必须覆盖相等运算符。 对于像Customer这样的典型域实体,实现equals方法和相等运算符的最佳实践是什么? 如果两个实体的身份相同,它是否应该实现equals方法返回true ? 如果实体不是不可变的怎么办? 如果两个实体都是新的并且它们的身份具有空值,那该怎么办? 那么平等算子怎么样? 正如JaredPar在这里提到的, Equals将实际测量值的相等性,而==将测量它们是否是相同的参考。

在C#中,值类型是可变的还是不可变的?

值类型行为表明,我们持有的任何值都无法通过其他变量进行更改。 但是我仍然对我在这篇文章的标题中提到的内容感到困惑。 任何人都可以澄清吗?