TransWikia.com

O que seria esse "k_BackingField"

Stack Overflow em Português Asked by Willian on November 27, 2021

Estou com um projeto para criar um Smart Device em C# para Windows CE. Recebi um código resultado de engenharia reversa, só que tem uma parte que não estou conseguindo entender ou adaptar. Abaixo segue o código:

private string <codProduto>k__BackingField;
private string <funcionario>k__BackingField;
private string <estante>k__BackingField;
private string <armazem>k__BackingField;
private string <filial>k__BackingField;

public string codProduto
{
  get
  {
    return this.<codProduto>k__BackingField;
  }
  set
  {
    this.<codProduto>k__BackingField = value;
  }
}

public string funcionario
{
  get
  {
    return this.<funcionario>k__BackingField;
  }
  set
  {
    this.<funcionario>k__BackingField = value;
  }
}

public string estante
{
  get
  {
    return this.<estante>k__BackingField;
  }
  set
  {
    this.<estante>k__BackingField = value;
  }
}

public string armazem
{
  get
  {
    return this.<armazem>k__BackingField;
  }
  set
  {
    this.<armazem>k__BackingField = value;
  }
}

public string filial
{
  get
  {
    return this.<filial>k__BackingField;
  }
  set
  {
    this.<filial>k__BackingField = value;
  }
}

Ai tenho dois questionamentos:

  1. O que seria esse k__BackingField. Eu fiz uma pesquisa sobre essa “tag/propriedade” e vi coisas sobre JSon, deserialização e WCF. Só que lendo eles, acredito que não se aplica ao propósito do projeto.
  2. Pelo que me foi passado o sistema é em C# e o código que tenho ele está realmente em C#, porem tem as declarações das strings e logo em seguinda vem os objetos entre “< >”. O que seria isso? Na hora imaginei que fosse a declaração de Arrays, mas no C# o simbolo é [ ].

2 Answers

O código original desse é:

public class C {
    public string estante { get; set; }
    public string armazem { get; set; }
    public string filial { get; set; }
}

Coloquei no GitHub para referência futura.

Eu fiz a engenharia reversa da engenharia reversa :)

Este código no nível mais baixo da linguagem não existe. Antes de processar para gerar o código CIL de baixo nível é preciso fazer um processo na compilação chamado de lowering, ou seja, ele pega uma sintaxe mais abstrata de baixa para um nível um pouco mais concreto, ainda que permanece em alguma abstração, como tudo, exceto os elétrons excitados no computador.

Quando esta reescrita ocorre gera o código que você obteve, ou seja, para cada propriedade tem um campo privado e um par de métodos acessor e mutador para este campo. Ele usa um nome que é garantido ser único na aplicação por ferir a sintaxe padrão permitida na linguagem.

O código deve ficar assim:

public class C {
    [CompilerGenerated]
    private string <estante>k__BackingField;
    [CompilerGenerated]
    private string <armazem>k__BackingField;
    [CompilerGenerated]
    private string <filial>k__BackingField;

    public string estante {
        [CompilerGenerated]
        get {
            return <estante>k__BackingField;
        }
        [CompilerGenerated]
        set {
            <estante>k__BackingField = value;
        }
    }

    public string armazem {
        [CompilerGenerated]
        get {
            return <armazem>k__BackingField;
        }
        [CompilerGenerated]
        set {
            <armazem>k__BackingField = value;
        }
    }

    public string filial {
        [CompilerGenerated]
        get {
            return <filial>k__BackingField;
        }
        [CompilerGenerated]
        set {
            <filial>k__BackingField = value;
        }
    }
}

Como pode ser visto no SharpLab.

respondi sobre propriedades. Tem links com mais detalhes.

O que achou sobre JSON e WCF foi circunstancial. Nada a ver diretamente.

O uso do <> aí é só para garantir uma sintaxe que não vai conflitar. Estes símbolos são usados de forma apropriada para generics, mas não neste caso que é algo interno, você não pode usar desta forma no seu código.

Answered by Maniero on November 27, 2021

Vindo de engenharia reversa, estou acreditando que a ferramenta não foi capaz de identificar o nome do campo (privado) da propriedade, ou está arbitrariamente definindo um nome segundo um padrão próprio.

No entanto, além de o formado da escrita não ser muito amigável, não há segredo. Veja esse caso isolado, por exemplo:

private string <codProduto>k__BackingField;

...

public string codProduto
{
  get
  {
    return this.<codProduto>k__BackingField;
  }
  set
  {
    this.<codProduto>k__BackingField = value;
  }
}

Em um código escrito de modo mais 'natural', talvez tivéssemos algo assim:

private string codProduto;
public string CodProduto
{
  get { return codProduto; }
  set { codProduto = value; }
}

...

Segundo a documentação do C# (em inglês), esse código postado nem deve compilar (talvez intencionalmente), pois os nomes de variáveis devem:

  • Começar com uma letra, underline (_) ou arroba (@);
  • Ter os demais caracteres dentro do conjunto de letras, números ou underline (_).

Espero ter ajudado.

Answered by Diego Rafael Souza on November 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP