классная пара (дизайн) - PullRequest
0 голосов
/ 28 ноября 2011

я учусь C #. хорошо, у меня есть проблема: у меня есть класс:

 class Couple{
     private double first{private set; public get;}
     private double second{private set; public get;}
 }     

первый вопрос: прав ли я, что эти свойства имеют публичный геттер и частный сеттер? (это звучит странно, я знаю, но нужно знать разницу между частным / публичным полем и частной / публичной собственностью с публичным / частным набором / получением)

и второй вопрос.

если я хочу класс:

   class AnyCouple{
        public Type AnyCouple {public set; public get;}
        private AnyCouple first{private set; public get;}
        private AnyCouple second{private set; public get;}
   }

как это сделать? фиктивные вопросы, я знаю, извините

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

Класс, который вы хотите: Tuple .

Что касается общего принципа, вы хотите Generics .

Что касается свойств, вы можете применить другой модификатор доступа к одному из методов доступа, но не к обоим (тот, к которому вы не применяете модификатор, использует модификатор, примененный к самому свойству). И применяемый модификатор должен быть более ограничительным, а не более расслабленным:

private double first {private set; public get;} // wrong, 2 modifiers

private double first { set; public get;} // wrong, a relaxed modifier

public double first {get; private set;}  // correct

Хорошая статья на MSDN об этом.

2 голосов
/ 28 ноября 2011

По первому вопросу, да, вы правы.Свойства first и second имеют частный установщик и публичный получатель.Однако, как написано, ваш код не будет компилироваться.Если вы укажете модификатор доступа для метода получения или установки, он должен быть более строгим, чем модификатор доступа для свойства, и вы не можете указать модификатор доступа для обоих свойств.Кроме того, обратите внимание, что в идиоматике C # мы пишем сначала метод get, а затем метод setter и присваиваем свойствам имена PascalCase, например

public double First { get; private set; }

. Это позволит получить свойство с именем First с использованием public getter и a private setter и написано идиоматически.

Для второго вопроса вам следует использовать generics .Вы можете сделать все это так:

public class MyTuple<T1, T2> {
    private readonly T1 first;
    public T1 First { get { return this.first; } }
    private readonly T2 second;
    public T2 Second { get { return this.second; } }
    public MyTuple(T1 first, T2 second) {
        this.first = first;
        this.second = second;
    }
}

Но это уже встроено в .NET Framework.Вы можете просто использовать Tuple<T1, T2>.Обратите внимание, что его свойства Item1 и Item2 (аналогичные вашим first и second) имеют открытый метод получения;он поддерживается полем private readonly.

0 голосов
/ 28 ноября 2011

Что касается первого вопроса, private double first означает, что и получатель, и установщик будут частными. На самом деле вы хотите public double first, а затем контролировать доступность геттера и сеттера, как вы это сделали. Я считаю, что когда компилятор видит такое объявление свойства, он создает код для резервного хранилища (всегда приватное поле) и get / setters, как вы укажете.

Как уже упоминалось @GSerg, класс Tuple - это то, что вам нужно.

...