2009-08-15 1 views
0

Предположим, у меня есть следующие фрагменты кода, т. Е. Goo call foo, DataTable, созданный goo и foo, вызовет только Rows.Add. Затем goo будет использовать обновленные данные экземпляра DataTable из foo.C# передача ref type параметр issue

В моем случае есть ли какие-либо различия или преимущества по сравнению с использованием и использованием параметра ref?

Я использую C# + .Net 3.5 + VSTS2008.

void foo (ref DataTable dt) 
    { 
     // call Row.Add on dt 
    } 

    void goo() 
    { 
     DataTable dt1 = ...; // create a new instance of DataTable here 
     foo (ref dt1); 
     // read updated content of DataTable by foo here 
    } 
+0

Каковы шансы, что вы действительно примете ответ на этот вопрос? – womp

ответ

4

Вы используете только ref, если вы намереваетесь изменить то, что dt указывает на. Например, если вы хотите заменить его различнымиDataTable (или тип, полученный от DataTable).

В этом случае, вы просто с помощьюdt, так что нет никаких оснований для использования ref. С DataTable является классом, любые внесенные изменения в будут видны за пределами foo.

+0

Прохладный, ваш ответ очень ясный. – George2

0

Единственная разница/польза, которую я вижу, заключается в том, что код будет более понятным, если вы не передали его по ссылке.

+0

Спасибо! 1. С точки зрения функции, они имеют одинаковую функцию в моем сценарии? 2. Почему, по вашему мнению, не используется ref более понятно? – George2

+1

В других ответах далее было указано, почему. Вы должны использовать только по ссылке, если вам нужно, и в этом случае вы этого не сделаете. :) – klabranche

+0

Спасибо, klabranche! – George2

2

В этом случае существует абсолютная нулевая разница между использованием параметра ref или не ref ref. Единственное, что ref param позволит вам сделать в этой ситуации, это «dt = new DataTable()» и повлиять на основную функцию.

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

+0

«Единственное, что ref ref позволит вам сделать в этой ситуации, это« dt = new DataTable() »и повлиять на основную функцию». - Я не понимаю, что вы имеете в виду «позволить вам делать» и «влиять на основную функцию». Больше описаний? – George2

+0

Итак, когда вы передаете параметр, он делает 1 из 2 вещей, он передает фактическое значение VALUE (копия) параметра (не ref) или передает указатель на переменную. В примитивном типе (int, float и т. Д.) Это имеет огромное значение, так как изменение параметра ref в функции также изменяет его значение в вызывающем. – Erich

+0

С объектными типами вы уже используете указатель, поэтому любые значения изменяются в контексте не ref ref count. Однако, поскольку у вас есть копия указателя (не то же самое), повторное назначение его не влияет на вызывающую функцию.Используя ref-param, присваивание фактически изменит значение в вызывающей функции. В этом случае, если Foo сделал dt = новый DataTable(), значение dt1 в Goo было бы новым datatable. Без ref это не так. – Erich

3

Вам не нужен параметр ref, если вы не намерены возвращать другой объект. DataTable - это ссылочный объект, поэтому вы действительно передаете указатель на указатель. Если все, что вы намереваетесь, - это чтобы вызываемая функция вносила изменения в ваш экземпляр, вам не нужен ref.

+1

Прохладный, ваш ответ очень ясный. – George2

0

Другие уже ответили, но если вы хотите получить дополнительную информацию, вы можете прочитать мой номер article on parameter passing in C#.

(Все правы - если вы просто хотите изменить данные в объекте, вы отлично передаете аргумент по значению. Если вы хотите изменить, к какому объекту относится переменная вызывающего, , то вы проходите мимо ссылка.)

+0

@Jon: «Если вы просто хотите изменить данные в объекте, вы прекрасно передаете аргумент ** по ссылке **« Разве это не должно быть «по значению»? – Ash

+0

Упс, спасибо, исправлено :) –