скрыть конструктор без параметров в структуре - PullRequest
25 голосов
/ 11 февраля 2009

Можно ли скрыть конструктор без параметров от пользователя в c #

Я хочу заставить их всегда использовать конструктор с параметрами

например. эта позиция класс

public struct Position
{
    private readonly int _xposn;
    private readonly int _yposn;

    public int Xposn
    {
        get { return _xposn; }
    }

    public int Yposn
    {
        get { return _yposn; }
    }

    public Position(int xposn, int yposn)
    {
        _xposn = xposn;
        _yposn = yposn;
    }        
}

Я хочу, чтобы пользователи могли создавать новую позицию только путем указания координат x и y

Однако конструктор без параметров ВСЕГДА доступен

Я не могу сделать это приватным. Или даже определить его как публичный

Я прочитал это Почему я не могу определить конструктор по умолчанию для структуры в .NET?

но это не очень помогает

Если это невозможно - каков наилучший способ определить, имеет ли пройденная мной позиция значения?

Простота проверки каждого поля свойства? Есть ли более гладкий путь?

спасибо

Ответы [ 4 ]

28 голосов
/ 11 февраля 2009

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

Вы можете создать частный конструктор без параметров для структуры , но не в C #. Однако, даже если вы сделаете это, это не очень поможет - потому что вы можете легко обойти это:

MyStruct[] tmp = new MyStruct[1];
MyStruct gotcha = tmp[0];

Это будет значение по умолчанию MyStruct - значение "все нули" - без вызова конструктора.

Вы можете легко добавить метод Validate в вашу структуру и вызывать его каждый раз, когда вы получаете его в качестве параметра, по общему признанию.

4 голосов
/ 11 февраля 2009

Нет, не могу это скрыть. Структуры не могут переопределить конструктор с нулевым аргументом, поэтому его видимость не может быть переопределена.

2 голосов
/ 11 февраля 2009

Вы не можете создать структуру с закрытым конструктором без параметров или даже объявить конструктор без параметров. Вы должны были бы изменить это на класс. Структуры не позволяют объявлять конструктор без параметров.

Из Руководства по структурам в MSDN:

Структуры могут объявлять конструкторы, но они должны принимать параметры. Ошибочно объявлять конструктор по умолчанию (без параметров) для структуры. Члены структуры не могут иметь инициализаторы. Конструктор по умолчанию всегда предоставляется для инициализации членов структуры их значениями по умолчанию.

Из спецификации C # в MSDN:

11.3 Классовые и структурные различия

Структуры отличаются от классов несколькими важными способами:

  • Структуры являются типами значений (Раздел 11.3.1).
  • Все типы структур неявно наследуются из класса System.ValueType (Раздел 11.3.2). Назначение переменная типа структуры создает копия присваиваемого значения (Раздел 11.3.3).
  • Значением по умолчанию для структуры является Значение производится путем установки всех значений введите поля в их значение по умолчанию и все поля ссылочного типа к нулю (Раздел 11.3.4). Бокс и операции распаковки используются для преобразовать между типом структуры и объект (раздел 11.3.5).
  • Значение этого отличается для структуры (раздел 11.3.6).
  • Объявления полей экземпляра для структура не разрешается включать инициализаторы переменных (Раздел 11.3.7).
  • Структуре запрещено объявлять конструктор экземпляра без параметров (Раздел 11.3.8).
  • Структуре запрещено объявлять деструктор (раздел 11.3.9).
2 голосов
/ 11 февраля 2009

Ну, структура в буквальном смысле является декларацией того, как будет располагаться память.

Даже когда вы используете объект, указатель объектов объявляется независимо от того, является ли он нулевым.

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

Вы можете преобразовать эту структуру в объект для достижения этой задачи. Или использовать статический анализ, чтобы убедиться, что он инициализирован перед использованием?

struct point
{
   int xpos;
   int ypos;
}

Поищите неизменные объекты в Google, это то, что вам нужно. Я считаю, что они хотят добавить эту функцию (но не в C # 4) к самому языку, потому что это общее требование. Есть ли конкретная потребность в структуре здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...