2013-05-09 1 views
1

Как предотвратить создание класса, неявно ссылающегося на его собственный класс?Как предотвратить класс, ссылающийся на его собственный класс?

пример:

class foo 
{ 
    public foo(int y) 
    { 
     x = y; 
    } 
    public int x; 
} 
class program 
{ 
    static void Main() 
    { 
     foo myFoo1 = new foo(10); 
     foo myFoo2 = myFoo1; //How do i prevent this? 
     Console.Read(); 
    } 
} 
+0

Мне любопытно узнать, какую ситуацию вы имеете в виду, где вы хотите предотвратить это. –

+0

Может быть, он смущен, как реализовать singleton в C#? Не знает о 'статических' классах и т. Д.? Я просто догадываюсь. –

+1

Почему вы хотите предотвратить это? –

ответ

4

Вы не можете предотвратить это. myFoo1 имеет тип foo, поэтому его можно присвоить myFoo2, период.

В любом случае, это не ясно, что, по вашему мнению, можно получить, предотвратив это. Так как foo является ссылочным типом (class), результатом присваивания является то, что ранее у вас было только одно имя, с которым можно ссылаться на созданный вами объект foo, теперь у вас есть два. Поскольку имена доступны только для удобства разработчика, нет никакой разницы в поведении вашей программы. Назначение не создает другого объекта.

Обратите внимание, что если foo были тип значения (а struct), то задание будет сделать копию значения; myFoo1 и myFoo2 будут полностью независимы друг от друга.

+0

возможно, когда объект будет располагаемым, он может захотеть контролировать ссылки, но тогда слабые ссылки будут намного лучше. –

+0

@ KeithNicholas: Управление ссылками легко: не передавайте их другому коду. Кроме того, передача их или нет полностью ортогональна тому, сколько ссылок на один и тот же экземпляр у вас есть. – Jon

1

Вы просто не можете ограничивать переменные таким образом. Переменная типа X может ссылаться на любой экземпляр объекта типа X (для классов)/может быть присвоено любое допустимое значение типа X (для структур).

Единственная вещь, которую вы можете сделать, это сделать структуру, поскольку назначение структуры создает новую копию этой структуры. Например:

struct foo 
{ 
    public int x; 

    public foo(int y) 
    { 
     x = y; 
    } 
} 

static void Main() 
{ 
    foo myFoo1 = new foo(10); 
    foo myFoo2 = myFoo1; 
    myFoo2.x = 5; 
    Console.WriteLine(myFoo1.x); // 10 
} 
1

Короче говоря, вы смущены о том, что вы думаете, что происходит (или, по крайней мере, в редакции).

В C# есть объекты в памяти и ссылки на эти объекты. Когда вы делаете

foo myFoo1 = new foo(10);

myFoo1 является ссылкой, а значение ссылки место в памяти, где хранится объект foo типа.

Когда вы

foo myFoo2 = myFoo1;

myFoo2 является ссылкой, а значение ссылки место в памяти, где хранится объект foo типа - тот же самый объект. Обе ссылки делают одинаковые вещи неразличимо.

myFoo2 и myFoo1 делают одинаковые вещи, так как вы могли бы предотвратить один, разрешая другим?

Если вы имеете в виду «как мне предотвратить привязку двух переменных к одному и тому же объекту?"Есть два решения, в зависимости от того, что вы имеете в виду:

  1. Если проблема заключается в том, что у вас есть две переменные, ссылающиеся на тот же объект, одна переменных мутирует объект и другие переменную„неожиданно“видит изменения, сделать объект неизменный и «мутации» объекта фактически возвращают новый, неизменный объект с внесенными изменениями.

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

Смежные вопросы