Const объекты в C # как параметр - PullRequest
0 голосов
/ 23 ноября 2011

В C ++ вы можете передать в функцию объект const.Это заставляет код обрабатывать этот объект как «только для чтения» (игнорируя тот факт, что вы можете удалить константность с помощью приведений).Я пытаюсь сделать то же самое с C #.У меня есть интерфейс, который пользователь будет реализовывать.Один из методов получит объект в качестве параметра.Как сделать объект 'const' в области действия метода и изменить в противном случае.

Решение: интерфейсы.Я делаю интерфейс, где единственное действие, доступное для свойства, это «get».

public interface IVal { ... }


public interface IFoo
{
    IVal Val { get; }
}

public class Foo : IFoo
{
    public IVal Val { get; }
}

Я прохожу через интерфейс, и все замечательно.Тем не менее, в моем конкретном классе, я хотел бы иметь «набор» в наличии.Это позволило бы мне установить конкретный класс Value.Как бы выглядел мой конкретный класс?

Я думал об использовании ключевого слова «internal».Я прочитал, что он предоставляет метод / свойство для кода в вашей собственной сборке.Это мой ответ?

РЕДАКТИРОВАТЬ: Чтобы проиллюстрировать это лучше, я добавил сеттер, который будет автоматически использовать меня.Однако для каждого свойства это много повторяющегося кода:

private Val _val;
public IVal Val
{
    get { return this._val; }
    set { this._val = value as Val; }
}

Ответы [ 2 ]

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

Вы можете просто добавить set, и он будет работать нормально:

public IValue Value { get; set; }

Таким образом, вы можете установить значение, если у вас есть Foo, но не если у вас есть IFoo.Аналогично случаю C ++, если у вас есть IFoo, вы можете привести к Foo (при условии, что объект фактически равен Foo), а затем использовать установщик.

Другой вариант - сделатьsetter protected или private:

public IValue Value { get; private set; }

Это позволяет вам убедиться, что только код в этом классе (или унаследованный класс * protected) может установить свойство.

Относительно internal: да, он предоставляет члену только код в той же сборке (и дружественных сборках).Но это используется не очень часто.Используются (и полезны) внутренние типы, которые даже используются по умолчанию, если вы не укажете, что этот класс public.

Это может помочь вам в вашей проблеме.Если вы сделаете Foo internal, метод в другой сборке с IFoo не сможет установить свойство, даже с приведением.

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

1 голос
/ 23 ноября 2011

Вы можете сделать что-то похожее

public class ReadonlyTestClass {
 private readonly object _name;
 public ReadonlyTestClass(object name) {
   _name = name;
 }
 public object Name {get { return _name; }}
}

Или

public class ReadonlyTestClass {
 public ReadonlyTestClass(object name) {
   this.Name = name;
 }
 public object Name {get; private set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...