2015-07-27 1 views
1

В одном из своего blogs Эрика Липперта сказал:ли какая-либо поддержка языка .net возвращение реф типа

Наконец, CLR действительно позволяет «реф возвращаемых типов»; вы могли бы теоретически иметь метод «ref int M() {...}», который возвращал ссылку на целочисленную переменную. Если по какой-то причудливой причине мы решили разрешить это в C#

Поддерживает ли VB или F # это? Я думал о различных способах создания сильно типизированных коллекций свойств, без использования отражения ...

ОБНОВЛЕНИЕ: от C#7 поддерживается.

ответ

0

По словам Эрика Липпета - C# поддерживает эту функцию.

вполне возможно создать версию C#, которая поддерживает как эти функции. Затем вы можете сделать что-то вроде

static ref int Max(ref int x, ref int y) 
{ 
    if (x > y) 
    return ref x; 
    else 
    return ref y; 
} 

, а затем вызвать его с

int a = 123; 
int b = 456; 
ref int c = ref Max(ref a, ref b); 
c += 100; 
Console.WriteLine(b); // 556! 

вы можете прочитать больше о своем ответе на вопрос о типы возврата реф в C#:

Why doesn't C# support the return of references?

Что касается вас, вопрос о VB - язык его не поддерживает:

Return By-Reference?

Хотя функции могут передавать переменные по ссылке, они не могут вернуть им таким образом. Когда функция возвращается, ее локальные переменные уже не имеют (или находятся в ожидании очистки, если они выделены в виде кучи). Функции поэтому всегда возвращаются по значению; потому что локальные переменные больше не имеют действительных адресов памяти, нет никаких ссылок на возвращаемые ссылки .

Вводя все это вместе, когда вы возвращаете объект из функции, копируется только то, что является адресом объекта. Когда вы верните тип значения из функции, само копирование будет скопировано.

Это означает, что ссылочные типы, по существу, типы значений, в котором значение является адресом памяти объекта в куче, (или ничего)

Источник: VB.NET, Is Object Returned by Reference from Function

Я не смог найти такая же информация для F #, но я думаю, это будет то же самое, что и VB - так что ответ - вы не можете вернуть ref в F #.

+1

Благодарим вас за ссылки.Отмечу, что Эрик сказал, что можно создать версию C#, которая сделала это, и что он это сделал, а не тот, что C#, как отправил, поддерживал его. Кроме того, ответ hoodaticus, хотя, похоже, добавляет эту проблему, отвечает на совершенно другой вопрос. Тем не менее, полезно для ссылок. – jmoreno

+2

Правильно, вы неправильно поняли, что я сказал. Я построил приватную тестовую версию C# с этой функцией, чтобы доказать, что это можно сделать. Мы решили не делать этого в реальном продукте. –

+0

Благодарим вас за разъяснение. – DeJaVo

Смежные вопросы