Как получить переменную ссылочного типа массива примитивов?

#c# #oop #primitive-types

#c# #ооп #примитивные типы

Вопрос:

Итак, мой вопрос можно описать простым кодом:

         double[] doubles = new double[]  { 0.01, 0.01, };
        var w2 = doubles;
        w2 = null;
        //doubles still has values
  

Я знаю о разнице между структурами и классами:

Если мы скопируем объекты в новые переменные: Point p2 = p1; Form f2 = f1; p2, будучи структурой, становится независимой копией p1 со своими собственными отдельными полями. Но в случае f2 все, что мы скопировали, — это ссылка, в результате чего и f1, и f2 указывают на один и тот же объект.

(источник:http://www.albahari.com/valuevsreftypes.aspx )

но есть ли какой-либо способ получить ссылочный тип, который позволил бы мне установить w2 равным null, установив doubles = null без использования приведения к List<double> , unsafe{} ?

Комментарии:

1. Тип просто double[] … не могли бы вы объяснить, что вы подразумеваете под ссылочным типом ?

2. В C у нас есть безопасные указатели, которые могут выполнять эту работу, в C # мы не можем без использования этого хитрого unsafe, который может легко сделать w2 нулевым

3. @LucasTrzesniewski Переменная ссылочного типа — это такой тип переменной в C #, который содержит ссылку на адрес памяти вместо значения. класс, интерфейс, делегат, массив являются ссылочным типом. Когда вы создаете объект определенного класса с помощью ключевого слова new, в управляемой куче создается пробел, который содержит ссылки на классы.

4. @Taumantis Я очень хорошо знаю C #, спасибо, так знаю ли я такого рода элементарные вещи 🙂 Но я просто не могу понять, о чем вы спрашиваете. Чего вы пытаетесь здесь достичь?

5. Не совсем понятно, в чем заключается ваш вопрос. Ваш комментарий «у w2 все еще есть значения». Это хорошо? Плохо? Вы ищете способ, чтобы doubles и w2 были псевдонимами ? Если это так, то это невозможно со встроенными типами C #, хотя создать класс контейнера очень легко. Кроме того, вы можете использовать out / ref parameters для обозначения параметров аргумента.

Ответ №1:

Я предполагаю, что вы на самом деле не имеете в виду, что doubles и w2 будут находиться в той же области видимости. Я предполагаю, что вы переходите doubles в какую-то другую область и что вы хотите передать ссылку вместо копии, чтобы вы могли изменять doubles из этого другого контекста?

 double[] doubles = new double[] { 1, 2, 3}; 

SomeMethod(ref doubles);


// This will return true
Console.WriteLine(doubles == null);


private static void SomeMethod(ref double[] w2)
{
    w2 = null;
}
  

Комментарии:

1. Я проверю мощь синтаксиса. Я думаю, что это могло бы сработать, если бы только w2 имел меньший размер, чем double. И я надеюсь, что 2.0 будет работать с этим. Если да, я проверю ответ

2. Также смотрите: ref (ссылка на C #)

Ответ №2:

Не совсем уверен, чего вы хотите, но если вы хотите программно получить тип w2, то просто сделайте это:

 Type w2_type = w2.GetType();
  

Вы можете добавить w2_type в список наблюдения, он должен иметь значение «{System.Double[]}»

Комментарии:

1. нет, как я уже говорил в комментариях, мне нужно каким-то образом получить указатель на переменную doubles