Передавая тип ref в свойстве, C # передается по значению или ref - PullRequest
1 голос
/ 25 февраля 2010

с использованием c #, vs2008, winforms

Если я передаю параметр через свойство в дочернюю форму из родительской формы или заражаю через свойство любой класс, и параметр, который я передаю в C #, является ссылочным типом, созданным в родительской форме, по умолчанию он передается как ссылка или значение?

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

По сути, я хочу вернуть заполненный объект обратно в родительскую форму, и лучше передать объект, созданный в родительской форме, по ссылке.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2010

Для ссылочных типов ссылка на переменную передается по значению. Если, конечно, вы не используете ключевые слова ref или out в C #, чтобы изменить это поведение.

Это означает, что свойство со значением DataSet передает, на самом деле, ссылку на экземпляр DataSet и передает его по значению.

"C # in Depth" Джона Скита является отличным справочником (без каламбура) по этим вопросам.

2 голосов
/ 25 февраля 2010

Важно отметить, что передача по ссылке в C # имеет особое значение. В случае свойства свойство в конечном итоге указывает на тот же адрес, что и адрес объекта, для которого оно было установлено. В случае передачи объектов в функцию, C # использует передачу ссылки по семантике значения. Это означает, что сама ссылка копируется, поэтому новый указатель указывает на тот же адрес, что и переданный объект. Это препятствует тому, чтобы функция обнуляла любой оригинальный указатель, устанавливая ее параметры в нуль. Чтобы фактически передать исходную ссылку, необходимо использовать ключевое слово 'ref':

class SomeClass
{
  public object MyObjectProperty { get; set; }
}

var someClass = new SomeClass();
object someObject = new object();

someClass.MyObjectProperty = someObject; // Makes MyObjectProperty point to the same location as someObject

В следующем случае используется ссылка по семантике значения:

void MyMethod(object someObject)
{
   someObject = null;
}

object someObject = new object();
MyMethod(someObject);
Console.WriteLine(someObject == null); // Prints false

В следующем случае используется фактическая передача по ссылочной семантике:

void MyMethod(ref object someObject)
{
   someObject = null;
}

object someObject = new object();
MyMethod(ref someObject);
Console.WriteLine(someObject == null); // Prints true
1 голос
/ 26 февраля 2010

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

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

0 голосов
/ 25 февраля 2010

C # не передается по ссылке так же, как C ++. Точнее сказать, что он проходит по ссылочному значению (в любом случае для ссылочных типов).

Читать это Джон Скит

...