什么是“价值”在C#中的属性类型保留字
-
20-08-2019 - |
题
我想知道在属性“值”的关键字需要什么类型的。
这样:
public class Test
{
string _numberAsString;
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _numberAsString; }
set { _numberAsString= value; }
}
public int Number
{
get { return int.Parse(_numberAsString); }
set { _number = value; }
}
}
//elsewhere
Test t = new Test();
t.Number = 5;
现在,这并不编译,就像我所期待。该类型的“价值”是由物业的返回类型决定的,是正确的吗?我无法找到任何这种效果,也许是太明显(我没有读过语言规格,想必那里面有东西)。
我问,因为我想与一种类型,然后将其转换成吸气剂的类型来设置的属性。我想这并没有什么意义。
看来我将不得不通过创建几个方法来实现这一目标。
解决方案
是,“价值”的类型是由属性的返回类型确定。究竟什么是你想实现什么?你希望能够要么号码或NumberAsString设置为有效的值,得到的结果退了出来,从任一属性?
如果这是你需要做的是这样的情况:
public class Test
{
string _numberAsString;
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _numberAsString; }
set { _numberAsString= value; }
}
public int Number
{
get { return int.Parse(_numberAsString); }
set { _numberAsString = value.ToString(); }
}
}
这将允许你这样做:
Test t = new Test();
t.Number = 5;
Console.WriteLine(t.NumberAsString); // should print out "5"
t.NumberAsString = "5";
Console.WriteLine(t.Number); // should print out "5"
您不能有一个get和该采取不同类型的属性集合。你有唯一的选择是在内部存储它作为一种类型,然后在任一的get或该组(或两者)执行从一种类型转换到另一种。
其他提示
类型的设定器的值的是属性的类型 - 你可以不是一个字符串传递给是一个int的属性,这必须首先被解析为int。
在.NET字符串不能强迫任何其他类型(在方式Perl中,AWK和许多其他动态语言允许)它们只能被视为串,或作为它们的父类对象。
您可以做follwoing:
private int _number;
private string _numberAsString;
public string NumberAsString
{
get { return _numberAsString; }
set { LinkedSet(value); }
}
public int Number
{
get { return _number; }
set { LinkedSet(value); }
}
private void LinkedSet(string s)
{
this._number = int.Parse(s);
this._numberAsString = s;
}
private void LinkedSet(int i)
{
this._numberAsString = i.ToString();
this._number = i;
}
显然NumberAsString设定器可以抛出一个出现FormatException数设定器不能。
我不除非您一般建议这虽然确实需要避免串数字和字符串转换为数字定期(此时可以使制定者懒惰在他们的链接的价值evalition - 虽然改变了异常的语义从一组字符串的对INT获取 - 可能是最好恼人或在最坏的一个讨厌的错误
为什么不只是做
Test t = new Test();
t.Number = 5;
Console.WriteLine(t.Number.ToString());
我感到那你想成为狡猾没有真正的理由。
我认为你正试图在这里使用一个属性当一个方法会更合适。一个属性是不应该有任何无法预料的副作用,此将通过执行在其上的类型转换(如果有可能)。
这是没有意义的,对我来说,允许在NumberAsString二传手。
为什么不这样:
public class Test
{
int _number = -1;
public Test() {}
public string NumberAsString
{
get { return _number.ToString(); }
}
public int Number
{
get { return _number; }
set { _number= value; }
}
}