C 中的新运算符返回值#

The new operator return value in C#

提问人:Totally New 提问时间:4/20/2023 最后编辑:Joel CoehoornTotally New 更新时间:4/21/2023 访问量:221

问:

在 C# 中,可以使用新运算符来初始化特定类型(类)的对象。例如,假设我们有一个 Person 类,以下代码从 Person 类创建一个对象实例:

Person person1 = new Person("Leopold", 6);

我的问题是:实际返回的是什么? 它是否返回:new Person("Leopold",6)

  1. 对 Person 对象的引用

  1. 对象本身?
C# 指针 引用 Pass-by-Reference 运算符-关键字

评论

5赞 Jon Skeet 4/20/2023
如果 is 类,则返回引用。变量的值也是一个参考。在 C# 中没有返回“对象本身”(对于引用类型)的概念。Personperson1
0赞 Narish 4/21/2023
调用类的构造函数时,对象的实例将分配到堆上,并返回对该实例的引用。现在对于您标记的其他事情:1) 就像在 Java 中一样,dotnet 不希望您担心指针,但我们确实指针类型,主要用于与非托管代码和/或不安全代码进行互操作 2) 传递引用使用 ref 关键字,链接的文档非常清楚如何使用它

答:

-1赞 Anil Kumar 4/21/2023 #1

对于您的情况,它返回指向在堆中创建的对象内存位置的引用。提供以下示例以便更好地理解。

`Box b1; //Reference variable, can not create memory //b1 is called a reference variable (not object). As of now, b1 is null  
Box b2 = new Box();// object b2 of class BOX is instantiated and create memory on Heap. now b2 points box object  
Box b3 = new Box();  // object b3 (new object created with new memory)
b3.length = 10;  
b3.width = 20;  
  
b1 = b3; //an object is assigned to a reference variable 

//now both b1 and b3 both points to same memory location. if any one updated then another one automatically updated.`

希望对你有所帮助!

您也可以参考以下链接进行详细解释: https://www.c-sharpcorner.com/code/3434/object-creation-and-difference-between-object-and-reference-variable-in-c-sharp.aspx#:~:text=Object%20is%20an%20instance%20of%20a%20class.%20Class,b1%20is%20called%20a%20reference%20variable%20%28not%20object%29

0赞 John Alexiou #2

简短的回答是,if is a 然后返回对对象的引用Personclassnew Persion()

您正在考虑引用与值语义是件好事。请注意,定义语义的不是关键字,而是正在初始化的数据结构。new

当 .NET Framework 开始时,两者之间有一条清晰的界限,但近年来,随着语言的新增,事情不再那么清晰了。

我将尝试在下面列出一个列表,将不同的语言结构放在值与引用语义中,并将此答案标记为 wiki 供其他人添加/编辑

价值语义 参考语义
用户结构struct Foo { } 用户类class Foo { }
原始整数 , ,intlongbyte 接口interface IFoo { }
其他原语 ,charbool string文字"abc"
原始数 ,floatdouble 记录类型record Foo(int Age) { }
命名常量enum
文字元组 ,(1,2,3)ValueTuple<> 元组Tuple<>
Span<T>,Memory<T>
可为 null 的值类型等int?long? 可为 null 的引用类型string?
用户参考结构ref struct { }

并不是说没有什么能阻止你使用带有基元类型的 new 关键字,例如 x = new double();