C# 属性作为引用

标签 c# properties reference parameter-passing argument-passing

<分区>

基础知识我搞砸了 C# 属性和引用类型。

public Address adr { get; set; }

public class Address
{

    //Field
    public string AddressLine1;   

    //Property
    public string Country {get; set;}
}

public void ChangeCountry(string _Country)
{
    _Country = "US";
}

public void ChangeAddress(Address _adr)
{
    _adr.Country = "US";
}

private void button1_Click(object sender, EventArgs e)
{
    adr = new Address();
    ChangeCountry(adr.Country);

    MessageBox.Show(adr.Country);
    //(?)Country is reported empty string. Property did not updated outside.

    ChangeAddress(adr);

    MessageBox.Show(adr.Country);
    //OK. Country is reported 'US'


}

这是我的问题;

  1. 当我们将属性(简单或复杂的)直接传递给尝试修改它的方法时,是否确保此属性在所有地方都被修改?我的意思是喜欢 ref 关键字?由于我不能将“ref”关键字与属性一起使用;我直接将属性传递给修改方法,我不确定它是否总是会在外部进行更新/修改。当我没有看到 ref 关键字时;这让我很担心:)

  2. 在上面的例子中; adr 类在没有 ref 关键字的情况下成功更新(ChangeAddress);但 ChangeCountry 方法无法更新字符串 Country 属性。这是字符串的特例吗?

最佳答案

不,传递给方法的属性不会在该方法中修改,因为您不能通过引用传递它们。属性始终按值传递,因此您不能在将它们传递给两个的方法中更改它们的值。

但是,这实际上并不是您在两种方法中所做的,这就是为什么一种有效而另一种无效的原因。

第一种方法:

public void ChangeCountry(string _Country)
{
    _Country = "US";
}

尝试更改没有 ref 关键字的参数的值,但失败了(如您所述)。

你的第二种方法,

public void ChangeAddress(Address _adr)
{
    _adr.Country = "US";
}

不是试图改变它的参数值。您传递到方法中的 Address 对象在整个方法中保持为相同的 Address 实例。但是,因为 Address 是引用类型,您可以更改它的属性,并且一旦方法返回,这些更改将持续存在。它们也将对引用同一实例的任何其他地方可见。

要查看区别,如果您尝试在第二种方法中执行此操作,它将失败,原因与第一种方法相同:

public void ChangeAddress(Address _adr)
{
    _adr = new Address();
    _adr.Country = "US";
}

在这里,您正在尝试更改参数的值——更改为该类的新实例——如果没有 ref 关键字,这是行不通的.

关于C# 属性作为引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941651/

相关文章:

c# - 当应用程序是 64 位时,以 32 位模式运行代码,可能吗?

c# - 在没有 OuterXML 的情况下验证(和查询)XmlElement 内容?

c# - 序列化问题

Swift - Alamofire - 从照片库上传文件

assemblies - CLR 何时尝试加载引用的程序集?

c# - 如何计算私有(private)工作集(内存)?

xml - 如何在 .propdesc 文件中使用 relatedProperty

java - 当并非所有属性都在同一个类中时填充 JavaFX TableView

objective-c - 在自定义 getter/setter 方法中使用 NSKeyedArchiver/Unarchiver

c++ - const 引用如何绑定(bind)到右值