假设我们有一种类型:

public class SomeClass
{
    public int intProperty { get; set; }
    ...
}

当我在这样的方法中传递属性时会发生什么?

var obj = new SomeClass();
obj.intProperty = 1;

SomeMethod(obj.intProperty);

public void SomeMethod(int value) { ... }

传递intProperty是否会像值类型通常所做的那样从属性中复制值?

推荐答案

Does a value type property in a reference type contain boxed value?

不,它包含值(int)本身(至少在我所知的当前C#实现中).如果您想更深入地了解CLR实现的详细信息,请查看Managed object internals篇系列文章:

托管对象的布局非常简单:托管对象包含实例数据、指向元数据的指针(也称为.方法表指针)和一包内部信息,也称为对象头.

enter image description here

What will happen when I pass the property in a method like this?

SomeClass.intProperty(通过getter调用)将被复制并作为参数传递给SomeMethod调用.

Will the passing of intProperty copy the value from the property like value types usually do?

是.如果你担心的是SomeMethod可以以某种方式改变SomeClass.intProperty的价值--那么不,它不能(尽管它与装箱/取消装箱无关):

SomeMethod(obj.intProperty);
Console.WriteLine(obj.intProperty);// Prints "1"

void SomeMethod(int value) 
{  
    value = 42;
    Console.WriteLine(value); // Prints "42"
}

附注:

我强烈建议遵循standard naming conventions,即此处物业的pascal case -SomeClass.intProperty->;SomeClass.IntProperty

Csharp相关问答推荐

为什么我不能更改尚未设置的模拟对象属性的值?

获取ASP.NET核心身份认证cookie名称

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

WeakReference未被垃圾收集

ASP.NET Core AutoMapper:如何解决错误 CS0121调用在以下方法或属性之间不明确

Azure函数中实体框架核心的依赖注入

如何将此方法参数化并使其更灵活?

EF核心新验证属性`DeniedValues`和`StringCompison`不起作用

是否由DI容器自动处理由ActivatorUilties.CreateInstance()创建的服务?

源代码生成器:CS8795分部方法';Class1.GetS2(字符串)';必须有实现部分,因为它有可访问性修饰符?

Postgres ENUM类型在第一次运行时对Dapper不可见

为什么我不能从我的异步任务方法中返回异步任务方法?

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

如何使用EPPlus C#在单个单元格中可视化显示多行文字

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

使用可空引用类型时C#接口实现错误

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

使用LibraryImport在多个dll中导入相同的函数

无法创建&Quot;&Quot;类型的实例,因为无法将一个或多个参数绑定到