Что я делаю неправильно с инициализаторами объекта C#?

Если вы хотите перечислить контейнеры в учетной записи хранения с токеном доступа, вы можете обратиться к приведенной ниже команде, я использую приложение AD v1, оно отлично работает на моей стороне.

# Get token for Azure Resource Manager API
$Body = @{
    'resource'      = 'https://management.azure.com/'
    'client_id'     = ''
    'grant_type'    = 'client_credentials'
    'client_secret' = ""
}

$params = @{
    ContentType = 'application/x-www-form-urlencoded'
    Headers     = @{'accept' = 'application/json'}
    Body        = $Body
    Method      = 'Post'
    URI         = 'https://login.microsoftonline.com//oauth2/token?api-version=1.0'
}

# Get token
$token = Invoke-RestMethod @params

$RestAPIParams = @{
    Uri    = "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Storage/storageAccounts//blobServices/default/containers?api-version=2018-03-01-preview"
    Method = "Get"
    Verbose = $true
    Headers = @{
        'authorization' = "Bearer $($token.access_token)"
        }
    }
$result = (Invoke-RestMethod @RestAPIParams).value

Результат теста :

enter image description here

7
задан Scott Langham 17 February 2009 в 22:09
поделиться

6 ответов

Свойства установлены для Имени и Возраста после того, как конструктор 'общедоступный Человек ()' закончил работать.

Person person = new Person { Name = "David", Age = "29" };

эквивалентно

Person tempPerson = new Person()
tempPerson.Name = "David";
tempPerson.Age = "29";
Person person = tempPerson;

Так, в конструкторе Возраст еще не будет становиться 29.

(tempPerson уникальное имя переменной, которое Вы не видите в своем коде, который не столкнется с другими экземплярами Человека, созданными таким образом. tempPerson необходим для предотвращения проблем многопоточности; его использование гарантирует, что новый объект не становится доступным никакому другому потоку, пока конструктор не был выполнен и после того, как все свойства были инициализированы.)


Если Вы хотите смочь управлять свойством Age в конструкторе, то я предлагаю, чтобы Вы создали конструктора, который берет возраст в качестве аргумента:

public Person(string name, int age)
{
   Name = name;
   Age = age;

   // Now do something with Age
   int x = Age;
   // ...
}
21
ответ дан 6 December 2019 в 04:58
поделиться

Ваша строка кода идентична:

Person person = new Person() { Name = "David", Age = "29" };

который идентичен:

Person person = new Person();
person.Name = "David";
person.Age = "29";

Как видете; когда конструктор выполняется, Age еще не установлен.

6
ответ дан 6 December 2019 в 04:58
поделиться

Отметьте, как важная техническая деталь, что:

Person person = new Person { Name = "David", Age = "29" };

эквивалентно:

Person <>0 = new Person(); // a local variable which is not visible within C#
<>0.Name = "David";
<>0.Age = "29";
Person person = <>0;

но не эквивалентно:

Person person = new Person();
person.Name = "David";
person.Age = "29";
9
ответ дан 6 December 2019 в 04:58
поделиться

Технически, этот код:

Person person = new Person { Name = "David", Age = 29 };

идентично этому коду:

Person tmpPerson = new Person();
tmpPerson.Name = "David";
tmpPerson.Age = 29;
Person person = tmpPerson;

который немного отличается, чем, что отправили другие:

Person person = new Person();
person.Name = "David";
person.Age = 29;

Это различие крайне важно, если Ваше приложение использует многопоточность.

4
ответ дан 6 December 2019 в 04:58
поделиться

Похоже, что Вы пытаетесь получить доступ Age в конструкторе объекта. Объектные значения инициализатора не будут установлены, пока конструктор не выполнился.

Попробуйте это:

Person person = new Person { Name = "David", Age = 29 };
int x = person.Age;

РЕДАКТИРОВАНИЕ в ответ на комментарий

Если Вам нужен доступ к Age в конструкторе самостоятельно затем необходимо будет создать явного конструктора с обязательными параметрами и использование это вместо объектного синтаксиса инициализатора. Например:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;

        int x = Age;  // will be 29 in this example
    }
}

Person person = new Person("David", 29);
3
ответ дан 6 December 2019 в 04:58
поделиться

Ну, как другие сказали, конструктор без параметров выполнялся сначала, следовательно Ваше затруднительное положение.

Я действительно должен спросить однако, если Вы установили поле вместо автоматического свойства для Вашей переменной Возраста?

public class Person
{
    private int _age;

    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
 }

Вы могли использовать _age вместо x если это достаточно, или если действительно необходимо использовать x:

public class Person
{
    private int _age;
    private int x;

    public int Age
    {
        get { return _age; }
        set 
        { 
            _age = value;
            x = _age;
        }
    }
 }

Какой бы ни является более соответствующим.

0
ответ дан 6 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

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