返回对象的引用

时间:2009-07-03 15:56:02

标签: c#

我正在尝试返回对象的引用,而不是按值传递它。这是由于无法通过引用传递属性。

我怎样才能得到下面的代码来写'新号牌'而不是'旧号码牌'。看了一下后,好像我不能。只是想先确定一下。看起来很奇怪你不能。

干杯

史蒂夫

http://hardcode.ro/archive/2008/03/18/c-return-reference-types.aspx

http://geekswithblogs.net/akraus1/archive/2006/02/10/69047.aspx

 public partial class Test2 : DefaultPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var car = new Car();
            var numberPlate = car.GetNumberPlate();
            numberPlate = "new number plate";
            Response.Write(car.GetNumberPlate());
        }
    }
}


public class Car
{
    private string _numberPlate;

    public Car()
    {
        _numberPlate="old number plate";

    }

    public string NumberPlate
    {
        get { return _numberPlate; }
        set { _numberPlate = value;}
    }
    public string GetNumberPlate()
    {
        return _numberPlate;
    }
}

6 个答案:

答案 0 :(得分:5)

你这样做有点倒退。如果要更改其值,则需要实际更改对象的属性。

car.NumberPlate = "old number plate";
Response.Write(car.GetNumberPlate());

如果您想使用引用,可以使用 ref 关键字。这可能不是你想要的。

答案 1 :(得分:3)

您需要更清楚地了解对象和引用之间的区别。您的属性已经返回对包含当前数字牌的字符串的引用。它不可能返回对象本身,因为string是引用类型。 (即使您使用了值类型,该属性也只会返回数据的副本,因此更改为变量的值仍然不会影响该属性。)

您似乎想要的不是对对象的引用,而是对属性的引用。在C#中没有办法做到这一点 - 在我看来这是一件好事,因为它提升了可读性。您在示例中尝试编写的代码类型要理解起来要复杂得多,因为为正常变量赋值可以做任何事情。

有关详细信息,请参阅我的article about value types and reference types

答案 2 :(得分:2)

     protected void Page_Load(object sender, EventArgs e)
    {
        var car = new Car();
        car.NumberPlate = "new number plate";
        Response.Write(car.NumberPlate);
    }

您的GetNumberPlate()方法似乎是多余的。

如果您使用的是C#3或3.5,我会将其重写为:

    public partial class Test2 : DefaultPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var car = new Car();
            car.NumberPlate = "new number plate";
            Response.Write(car.NumberPlate);
        }
    }


public class Car
{

    public Car()
    {
        NumberPlate="old number plate";
    }

    public string NumberPlate { get; set; }

}

答案 3 :(得分:2)

由于字符串是不可变的,所以你不能这样做。您在此行中获得的值:

var numberPlate = car.GetNumberPlate();

是对所有意图和目的的引用(因为字符串的值不会复制到不同的内存地址),但这一行

numberPlate = "new number plate";

在语义上与:

相同
numberPlate = new string("new number plate");

导致该引用指向不同的字符串。

答案 4 :(得分:0)

您是否希望以与将方法传递到函数相同的方式传递属性?对于方法,你可以做这样的事情;

// fn takes a method which returns string, calls it, and prints it.
void PrintsAMethodsResult(Func<string> GetString)
{
  Console.WriteLine( GetString() );
}

// calls like this;
PrintsAMethodResult( Car.GetNumberPlate );

但如果你想用一个属性来做,你就会有点混乱;属性实际上只是两个方法(一个getter和一个setter,类型为Func<T>Action<T>)所以你必须编写不同的东西来处理setter和getter。可以像这样调用getter属性;

PrintsAMethodResult ( () => Car.NumberPlate );

这与GetNumberPlate方法的工作方式相同,通过创建一个不带参数的函数并返回汽车的车牌,有效地将属性转换为函数。

没有更好的方法来传递getter属性,就像它是一个方法一样。

答案 5 :(得分:-1)

在“Car”中创建另一个类,然后返回它。那应该没问题。虽然可能你不想这样做,因为它不是一种好的编码方式。