2012-01-15 175 views
-3

为什么此代码不起作用?属性和专用集合

class Test 
{ 
    int Abc { private set; get; } 
} 

什么是属性的默认访问修饰符?

+0

是的,C#,对不起。 – Never 2012-01-15 15:12:45

+0

可能重复的[C# - 属性必须更严格?](http://stackoverflow.com/questions/6886514/c-sharp-property-must-be-more-restrictive) – 2012-01-15 15:19:48

+0

@Saeed虽然类似,我不认为这是一个重复。 – kenny 2012-01-15 15:49:06

回答

4

农行属性必须是public,protected或内部:

public int Abc { get; private set; } 

在你的情况的属性是私有的(因为你没有指定访问修饰符),所以它已经是一个私人组。你不能在当前类之外修改它的值,所以在这种情况下声明一个私有setter没有意义。

+0

@Colder,你可以。它已经是私人的了。因此,为私人财产定义一个私人二传手是没有意义的。无论如何,当前课程以外的任何内容都不能修改其值。它也无法获得它的价值,因为这个属性是私人的。在这种情况下,您不使用属性。你使用一个字段:'private int Abc;'。 – 2012-01-15 15:17:11

3

对于属性的默认访问修饰符是私有的,对于任何其他类的成员。如果你想使得二传手不易接近,你需要先让该传球更容易接近,然后对传球手施加限制。

class Test 
{ 
    public int Abc1 { private set; get; } 
    protected int Abc2 { private set; get; } 
    internal int Abc3 { private set; get; } 
    protected internal int Abc4 { private set; get; } 
} 
+0

通过'type',你需要排除枚举和接口,默认情况下它们的成员是公共的。 – Douglas 2012-01-15 15:25:11

+0

@Douglas没错。我将它改为一堂课。 – oleksii 2012-01-15 15:27:04

3

所有类成员(包括性)是private的缺省可访问性;见Accessibility Levels。您的set之前的private是冗余的,因此是错误的。您的代码将在语义上等同于以下内容:

class Test 
{ 
    int Abc { get; set; } 
} 

你只需要指定一个private访问修饰符为当地产是更方便您的set访问;例如(常见的场景):

class Test 
{ 
    public int Abc { get; private set; } 
}