2009-05-14 1 views
2

Я изучаю C# refs прямо сейчас.Безопасно предположить, что все переменные C#, инициализированные новыми, являются ссылками?

Можно ли предположить, что все переменные, назначенные новым, являются ссылками, а не значениями?

Пример:

SomeType variable = new SomeType() 
+0

см. Последний комментарий для ответа на ваш вопрос. – Gishu

ответ

4

No:

  • Instance классов являются ссылками, но экземпляры структур являются значением.
  • Классы и структуры могут одновременно быть построены с использованием новых

Например, System.Drawing.Point является struct не class:

Point point = new Point(1, 1); //point is a value, not a reference 
+0

Являются ли классы и структуры единственными двумя классами переменных? – Unknown

+0

Существуют и другие типы значений, например «int» и «bool» (которые могут быть, но обычно не инициализируются с использованием «новых») и значений «enum»: http://msdn.microsoft.com/en- us/library/s1ax56ch (VS.71) .aspx – ChrisW

1

Нет, типы значений не являются ссылками.

Но с любыми другими неценовыми типами и параметром ref/out они являются ссылками.

1

№. В структурах C# также создается экземпляр с использованием new(), но рассматриваются как значения.

0

Похоже, вы путаете ссылки на объекты. Если это случай, чем типы да, созданные с новым ключевым словом, это объекты. За исключением структур, которые рассматриваются как значения.

0

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

3

C# имеет два типа объектов - ссылочных типов (определяется с классом ключевое слово) и Типы значений (определенные с помощью ключевого слова struct).

  • RT созданы на управляемой куче. Когда вы делаете новый() в RT, вы возвращаете ссылку на объект в куче. Две переменные RT могут указывать на один и тот же объект.
  • VT создаются в стеке (если они не являются полем в ссылочном типе). Когда вы делаете новый() на VT, вы получаете переменную, указывающую на начало объекта в стеке. Две переменные типа значения не могут указывать на один и тот же объект - они всегда представляют собой два разных объекта в стеке. This however is an implementation detail the important thing to remember is that VTs have value type semantics.

Подберите хорошую книгу на C# для получения более подробной информации. Ее важная концепция.

+0

«Когда вы делаете новый() на VT, вы получаете переменную, указывающую на начало объекта в стеке». Означает ли это, что вы можете получить поврежденную память, если ссылаетесь на VT после того, как кадр стека завершился, как в C? – Unknown

+0

Microsoft прошла долгий путь ... CLR имеет проверки, чтобы избежать такого повреждения и проверяет код до его выполнения.Вы можете все же испортить, если перейдете к неуправляемому коду и возиться, однако это потребовало бы, чтобы вы отметили этот раздел кода ключевым словом «небезопасно» и потребовали активировать компилятор. В этом случае вы говорите, что несете ответственность за свой небезопасный код. – Gishu

+0

Подводя итог, в 99% случаев, если вы держите переменную VT/ref, вы можете быть уверены, что она указывает на действительный объект. CLR заботится об этом для вас. – Gishu

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

  • Нет связанных вопросов^_^