Подтвердить что ты не робот

Скрыть конструктор без параметров

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

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

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

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?

но он действительно не помогает

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

Объяснение каждого поля свойств? Есть ли более гладкий способ?

спасибо

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

Ну, структура - это буквально объявление о том, как будет сидеть память.

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

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

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

struct point
{
   int xpos;
   int ypos;
}

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

Ответ 4

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

Из Руководство по структурированию в MSDN:

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

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

11.3 Различия в классе и структуре

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

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