Почему я не могу передать свойство или индексатор как касательно параметра, когда отражатель.NET показывает, что это сделано в Платформе.NET?

Eclipse отдельно довольно чрезмерно увеличен в размере, и больше плагинов, которые Вы добавляете только, усиливает ситуацию. Это - все еще мой любимый IDE, поскольку это, конечно, не коротко на функциональности, но если бы Вы ищете легкий IDE тогда, я предложил бы угробить Eclipse; довольно нормально увеличить половину концерта памяти при отъезде его работающий некоторое время.

12
задан BenAlabaster 27 November 2009 в 22:43
поделиться

3 ответа

Я думаю, что это плохая интерпретация 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)

Ясно, что используется локальная переменная.

15
ответ дан 2 December 2019 в 07:03
поделиться

Попробуйте установить значение свойства для переменной перед передачей его функции.

string myClassName = x.ClassName
DoSomething(ref myClassName);

Это не самое элегантное решение, но оно должно указать вам правильное направление. Как сказал Юрий в своем комментарии выше, вероятно, это как-то связано с тем фактом, что вы явно не объявляете получение и установку для свойства.

1
ответ дан 2 December 2019 в 07:03
поделиться

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!

6
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: