仅在visual studio 2015中获取或设置的自动属性

时间:2016-01-11 13:40:02

标签: c#

我在这里看到很多关于仅使用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; }

给出错误。

任何人都可以解释原因吗?

3 个答案:

答案 0 :(得分:1)

这是因为没有设置自动实现属性的感觉。

您的代码可能包含set-only属性,因为它可能导致类状态。但你不能用自动实现的setter来做。

您可以使用initializers for auto-propertiesgetter-only auto-properties初始化只读属性,而不是它,然后获取值:

public int Foo { get; } = 3;

您可以将整个表达式添加到初始值设定项中:

public string Config { get; } = string.IsNullOrWhiteSpace(string connectionString =
(string)Properties.Settings.Default.Context?["connectionString"])
   ? connectionString 
   : "<none>";

您也可以使用Ctor assignment to getter-only autoprops

答案 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'分配给 - 它只读”