Может ли кто-нибудь помочь мне понять разницу между созданием экземпляра объекта и передачей значений во время создания по сравнению с его созданием и установкой свойств?

Когда я устанавливаю трассировку при создании объекта, я вижу, что domainName, id и guid входят в класс, но это просто полностью обходит установку guid. Он останавливается из-за того, что мое значение SASReadToken равно «нулю»?

Это работает:

TenantEntityModel tenantEntity = new TenantEntityModel
{
    PartitionKey = domainName,
    RowKey = id,
    SASReadToken = null,
    ApiKey = guid
};
TableOperation tableOperation = TableOperation.Insert(tenantEntity);

Передача значений во время создания дает мне все нули для guid:

TenantEntityModel tenantEntity = new TenantEntityModel(domainName, id, null, guid);
TableOperation tableOperation = TableOperation.Insert(tenantEntity);

Вот мой класс:

public class TenantEntityModel : TableEntity
{
    public string SASReadToken { get; set; }
    public Guid ApiKey { get; set; }

    public TenantEntityModel(string TenantDomainName, string Id, string SASReadToken, Guid ApiKey)
    {
        this.PartitionKey = TenantDomainName;
        this.RowKey = Id;
    }

    public TenantEntityModel() { }
}
c#
0
Jason Shave 24 Сен 2018 в 07:14

2 ответа

Лучший ответ

В вашем конструкторе TenantEntityModel(string, string, string, Guid) вы не устанавливаете для ApiKey никакого значения. Попробуй это:

public class TenantEntityModel : TableEntity
{
    public string SASReadToken { get; set; }
    public Guid ApiKey { get; set; }

    public TenantEntityModel(string TenantDomainName, string Id, string SASReadToken, Guid ApiKey)
    {
        this.PartitionKey = TenantDomainName;
        this.RowKey = Id;
        this.SASReadToken = SASReadToken;
        this.ApiKey = ApiKey;
    }

    public TenantEntityModel() { }
}

Обратите внимание: этот код: new TenantEntityModel {...} не является "передачей параметров конструктору" , купите "используйте значение по умолчанию (конструктор без параметров) и задайте свойства один за другим"

< EM> Примечание :

Что касается меня, я обычно не устанавливаю свойства с общедоступными сеттерами через конструктор, потому что вы всегда можете сделать это, как в вашем примере кода:

var tenantEntity = new TenantEntityModel
{
    PartitionKey = domainName,
    RowKey = id,
    SASReadToken = null,
    ApiKey = guid
};

Итак, если ваши сеттеры PartitionKey и RowKey общедоступны (как я вижу), ваш конструктор TenantEntityModel(string, string, string, Guid) по большей части бесполезен.

1
vasily.sib 24 Сен 2018 в 04:36

Когда вы делаете это:

TenantEntityModel tenantEntity = new TenantEntityModel
{
    PartitionKey = domainName,
    RowKey = id,
    ApiKey = guid
};

Вы эффективно делаете это:

TenantEntityModel tenantEntity = new TenantEntityModel();
tenantEntity.PartitionKey = domainName;
tenantEntity.RowKey = id;
tenantEntity.ApiKey = guid;

Это не следует путать с передачей параметров вашему конструктору (что вы делаете во втором примере). Ваш конструктор ничего не делает с параметрами SASReadToken и ApiKey. Вот почему их игнорируют.

Если вы хотите, чтобы конструктор выполнял эту работу, вам понадобится что-то вроде:

public TenantEntityModel(string TenantDomainName, string Id, string SASReadToken, Guid ApiKey)
{
    this.PartitionKey = TenantDomainName;
    this.RowKey = Id;
    this.SASReadToken = SASReadToken;
    this.ApiKey = ApiKey;
}
4
Nigel Whatling 24 Сен 2018 в 04:22