我正在尝试返回对象的引用,而不是按值传递它。这是由于无法通过引用传递属性。
我怎样才能得到下面的代码来写'新号牌'而不是'旧号码牌'。看了一下后,好像我不能。只是想先确定一下。看起来很奇怪你不能。
干杯
史蒂夫
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;
}
}
答案 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”中创建另一个类,然后返回它。那应该没问题。虽然可能你不想这样做,因为它不是一种好的编码方式。