Gostaria de saber qual é a maneira correta em C# de fazer essencialmente a mesma coisa que este código C++, que contém um ponteiro (referência) para um objeto de classe ou struct. Usarei struct neste exemplo, já que C# trata objetos struct/class de forma diferente.
struct sMyStruct { .. blah .. };
class MyClass {
sMyStruct *RefToStruct=nullptr;
MyClass(sMyStruct *reftostruct)
{
RefToStruct=reftostruct;
}
};
int main(void)
{
sMyStruct *mystruct = new sMyStruct( .. blah .. );
MyClass *c=new MyClass(mystruct);
delete c;
delete mystruct;
}
Na realidade, essa estrutura é criada em outro lugar (fora do meu controle, como parte de um framework, e atualizada dinamicamente) e cada uma se comporta de maneira diferente. MyClass só precisa usar a estrutura correta (escolha do programador), e é por isso que quero manter a referência do objeto na própria classe e não ter que passá-la para cada função/método criado para a classe.
Provavelmente: não.
Não há objeto; a
struct
em C# não é um objeto e só pode ser tratado como tal por boxing, o que criaria uma cópia isolada, o que frustraria sua intenção.Se o tipo estiver sob seu controle, sugiro que
sMyStruct
seja aclass
em termos de C#. Seu uso gritaclass
, e usarclass
aqui faria tudo funcionar.Existem duas maneiras de manter uma referência a um , mas suspeito que nenhuma delas se aplica aqui :
struct
ref
campo (um ponteiro gerenciado) dentro de umref struct
; definitivamente não se aplica, poisMyClass
não é umstruct
sMyStruct*
) usandounsafe
; isso pressupõe que o local seja fixo de alguma forma (um pino GC, memória não gerenciada ou a pilha do thread atual) e tenha restrições significativasNa verdade, suspeito que não haja razão para
sMyStruct
ser umstruct
. O fato de estarstruct
em C++ é irrelevante; C# e C++ têm significados completamente diferentes parastruct
vsclass
.Se você não tiver controle do código que define a estrutura, você sempre pode encapsulá-la em uma classe e compartilhá-la.
Agora todos estão compartilhando a mesma cópia do sMyStruct por meio do wrapper e você pode copiar a referência do StructWrapper conforme necessário.
Não há necessidade de código inseguro.