Разве я не должен получить предупреждение компилятора за это? как мне это включить? - PullRequest
1 голос
/ 25 августа 2010

допустим, у меня есть это

public class MyClass
{
    public string myMessage { get; set; }

    void MyMethod() 
    {
        string myMessage;
    }
}

, если я не получу предупреждение о myMessage в MyMethod, скрывающем (?) Свойство myMessage в классе?Я не получаю ничего такого, когда я строю.как активировать эту проверку?

Ответы [ 4 ]

8 голосов
/ 25 августа 2010

Проблема здесь в том, что у нас нет способа отличить действительный желаемый случай сокрытия от случайного случая сокрытия. Мы стараемся зарезервировать предупреждения для ситуаций, когда (1) код почти наверняка неправильный и (2) существует простой способ переписать код, чтобы исключить предупреждение, если указанный код действительно желательно.

Это часто желаемый случай из-за этого:

class Frog
{
    private string name;
    public Frog(string name)
    {
        this.name = name;

Вы не хотите менять поле «имя» на что-то другое, потому что оно полностью описательно как есть. Вы не хотите менять параметр «имя» на что-то другое, потому что вы хотите иметь возможность new Frog(name: "Kermit") в C # 4 или Visual Basic. Поскольку сокрытие желательно, а код верен, мы не хотим выдавать предупреждение о сокрытии.

6 голосов
/ 25 августа 2010

Я не знаю предупреждений для этого состояния. В пределах MyMethod() вы можете использовать this.myMessage для устранения неоднозначности между локальным свойством и свойством класса.

Просто к сведению, свойства обычно имеют титульный регистр, а местные - верблюжий. Использование этого соглашения может предотвратить конфликты имен, подобные списку, который вы перечислили.

2 голосов
/ 25 августа 2010

Выезд Lexical Scoping . MyMessage внутри MyMethod определено в новой области видимости. Любая ссылка на myMessage в этом методе будет предполагать, что вы ссылаетесь на переменную, определенную в этой области. Вы можете получить доступ к myMessage, определенному в MyClass, используя this.myMessage.

EDIT: Учитывая эту информацию, вы можете понять, почему это совершенно верно с точки зрения компилятора. Интересно, должно ли оно дать вам предупреждение. Как Mitch Wheat отметил в своем комментарии, такой инструмент, как ReSharper предупредит вас об этих вещах, но это спорно, если компилятор должен предупредить вас о столкновении для чего-то, он обрабатывает с лексической областью видимости. Похоже, больше работы для дополнительного инструмента.

0 голосов
/ 25 августа 2010

Это фактически соответствует одному шаблону именования для частных полей, хотя я предпочитаю _fieldName себя:

public class MyClass
{
    private string myMessage;

    public MyClass(string myMessage)
    {
        this.myMessage = myMessage;
    }
}
...