Проблема с указателем в C # - PullRequest
0 голосов
/ 29 ноября 2011

Посмотрите на следующий пример:

public void inc(int num) {
   num++;
}

int a = 5;
inc(a);

В этом случае inc не будет увеличивать саму переменную a.Он не указывает на то же место в памяти.Чтобы изменить a, мне нужно будет использовать ref.

Однако в этом примере

public static void ExportSelectedRow(GridView gridView, object toObject, int skipCols)
{
    GridViewRow gridViewRow = gridView.SelectedRow;

    if (toObject is DataTable)
    {
        DataTable returnDt = (DataTable)toObject;
        GridViewColsToDatatable(gridView, returnDt, skipCols);
        DataRow dr = returnDt.NewRow();
        for (int i = skipCols; i < gridViewRow.Cells.Count; i++)
            dr[i - skipCols] = gridViewRow.Cells[i].Text;
        returnDt.Rows.Add(dr);
    }

}

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) {
    DataTable dt = new DataTable();
    GridViewHelper.ExportSelectedRow(GridView1, dt, 1);
    ...
}

выбранная строка будет экспортирована из GridView1 вDataTable хотя я даже не упоминал об этом в функции.Так что toObject будет обновлено.Кажется, что

DataTable returnDt = (DataTable)toObject;

фактически ссылается на toObject.Поэтому мой вопрос, почему в этом примере это ссылка, а в первом - нет?

Ответы [ 5 ]

12 голосов
/ 29 ноября 2011

Вопреки тому, что собираются сказать другие люди, по умолчанию все (да и ссылочные типы) в C # передается по значению. С ref или out это не так.
Но в случае ссылочных типов то, что передается по значению, является ссылкой .

int - это, конечно, тип значения, DataTable - это ссылочный тип.

6 голосов
/ 29 ноября 2011

C # имеет типы параметров. Типы значений (структуры, перечисления, числа и т. Д.) И ссылочные типы (объекты, строки и т. Д.).

В вашем первом примере значение 5 передается функции, но во втором примере передается ссылка GridView1.

См. MDN для списка типов значений и ссылочных типов , которые определяют способ передачи параметров.

EDIT

Для лучшего определения см. Ответ Гарольда.

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

DataTable является ссылочным типом.int является типом значения.

C # передается по значению (если не используется ref или out).

  • Когда вы передаете DataTable методу, вы фактически передаете копию ссылки .Обе ссылки ссылаются на один и тот же объект .Изменения объекта будут видны для вызывающего абонента.
  • Когда вы передаете int, вы передаете копию значения .

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

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

В .NET есть два типа типов ermm ...: типы значений и ссылочные типы. Разница именно в том, что вы продемонстрировали выше.

Обычно каждый struct является типом значения, а каждый class является ссылочным типом. Базовые типы (такие как int, decimal, datetime, byte и т. Д.) Также реализованы в виде структур, поэтому они являются типами значений. Ну, на самом деле, они немного особенные, но они очень похожи на структуры.

В MSDN есть статья об этом, и эта тема широко освещалась и в других местах. Просто Google для "типов значений против типов ссылок".

0 голосов
/ 29 ноября 2011

Разница здесь между базовым типом, таким как int или double, и объектом.Когда вы передаете объект, вы передаете ссылку на него, в то время как с внутренними типами yo передает копию значения в функцию.

структуры интересны тем, что они синтаксически выглядят как классы, но передаются по значению(скопировано) вместо ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...