我在这里看到很多关于仅使用get或set的自动属性的答案。每个人都说这是不可能的,并试图解释。
但在export default class Bar extends Component {
componentDidMount() {
// How to trigger the onChange event for this.refs.foo
this.onChange();
}
onChange() {
// do stuff
};
render() {
return (
<div>
<Foo ref="foo" onChange={this.onChange} />
</div>
);
}
}
中,有可能:
VS2015
没关系。 但是:
public string Foo { get; }
给出错误。
任何人都可以解释原因吗?
答案 0 :(得分:1)
这是因为没有设置自动实现属性的感觉。
您的代码可能包含set-only属性,因为它可能导致类状态。但你不能用自动实现的setter来做。
您可以使用initializers for auto-properties或getter-only auto-properties初始化只读属性,而不是它,然后获取值:
public int Foo { get; } = 3;
您可以将整个表达式添加到初始值设定项中:
public string Config { get; } = string.IsNullOrWhiteSpace(string connectionString =
(string)Properties.Settings.Default.Context?["connectionString"])
? connectionString
: "<none>";
答案 1 :(得分:0)
我想你想要这样的东西
public class A
{
public int Foo { set { Foo = value; } // Set only properties can't
// be auto implemented
public int CalculateWithFoo()
{
int Bar;
Bar = Foo - 5; // Compile error: "A get or set accessor expected"
return Bar;
}
}
但是如果你这样做,你将得到一个一个get或set accessor expected 错误。因此,即使在课堂内,您也无法访问仅限设置的属性。
正如其他人所说,你可以成功
public int Foo { private get; set; }
所以它只能在你的课程中访问
答案 2 :(得分:0)
如果您要创建一个Property,那么它必须至少可以在同一个类中访问。
如果您希望您的财产只能在宣布它的类中访问,那么您可以使用
string FullName { private get; set; }
但是如果你想要你的属性应该从任何地方分配,但只能在声明它的类中读取,那么使用
class User { public string FullName { private get; set; } }
...............
static void Main(string[] args)
{ User u = new User();
u.FullName = "Banketeshvar Narayan";
Console.WriteLine(u.FullName);
}
它会给出编译时错误:
无法在此上下文中使用属性或索引器“User.FullName”,因为无法访问get访问器。
所以在上面的例子中,你可以从任何地方分配属性的值,但它只能在同一个类中读取。
在C#6.0中,引入了一些新方法来声明和分配属性
Way1:只读自动实现的属性
public string FirstName { get; }
如果您没有指定其值,则会返回默认值。
方式2:在声明时指定值:
public string FirstName { get; } = "Banketeshvar";
方式3:分配值在同一类的构造函数中:
User() { FirstName = "Banketeshvar"; }
方式4:纯粹的ReadOnly属性(表达身体属性)
如果您正在寻找纯粹的Readonly属性,请转到此
public string FullName => "Manish Sharma";
现在你不能从构造函数中赋予“FullName”值的值。如果您尝试这样做,则会抛出以下异常
“无法将属性或索引器'Person.FullName'分配给 - 它只读”