#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