Eclipse отдельно довольно чрезмерно увеличен в размере, и больше плагинов, которые Вы добавляете только, усиливает ситуацию. Это - все еще мой любимый IDE, поскольку это, конечно, не коротко на функциональности, но если бы Вы ищете легкий IDE тогда, я предложил бы угробить Eclipse; довольно нормально увеличить половину концерта памяти при отъезде его работающий некоторое время.
Я думаю, что это плохая интерпретация Reflector. На самом деле, если вы напишете свой код следующим образом:
static void Main(string[] args)
{
DummyClass x = new DummyClass();
string username = x.ClassName;
DoSomething(ref username);
}
и скомпилируете его в режиме Release, вы увидите это в Reflector:
static void Main(string[] args)
{
DummyClass x = new DummyClass();
DoSomething(ref x.ClassName);
}
Помните, что компилятор C # создает не код C #, а IL, поэтому то, что вы видите в Reflector, не всегда реальность. Итак, чтобы четко понять, что происходит под капотом, вы можете взглянуть на реальный код, созданный компилятором:
L_000f: callvirt instance string System.Web.Security.MembershipUser::get_UserName()
L_0014: stloc.0
L_0015: ldloca.s str
L_0017: ldc.i4.1
L_0018: ldc.i4.1
L_0019: ldc.i4.1
L_001a: ldc.i4 0x100
L_001f: ldstr "UserName"
L_0024: call void System.Web.Util.SecUtility::CheckParameter(string&, bool, bool, bool, int32, string)
Ясно, что используется локальная переменная.
Попробуйте установить значение свойства для переменной перед передачей его функции.
string myClassName = x.ClassName
DoSomething(ref myClassName);
Это не самое элегантное решение, но оно должно указать вам правильное направление. Как сказал Юрий в своем комментарии выше, вероятно, это как-то связано с тем фактом, что вы явно не объявляете получение и установку для свойства.
It's a reflector bug. It isn't really passing the property by reference.
Here's some C# code which will reproduce it.
using System;
class Person
{
public string Name { get; set; }
}
class Test
{
static void Main(){} // Just make it easier to compile
static void Foo(Person p)
{
string tmp = p.Name;
Bar(ref tmp);
}
static void Bar(ref string x)
{
}
}
Reflector shows this code for Foo
:
private static void Foo(Person p)
{
Bar(ref p.Name);
}
Not only is this invalid C#, but it's misleading - it would suggest that changes made to x
within Bar
would somehow modify p.Name
- where that's not the case when you look at the original C# code.
In your original sample, it makes even less sense as UserName
is a read-only property!