Разделяется ли статический класс при обращении из пакета NuGet в основном приложении и DLL? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть пакет Nuget со статическим классом внутри. Этот пакет потребляется DLL и моим основным приложением, которое, в свою очередь, также использует DLL. Поэтому мой вопрос заключается в том, что если какое-либо изменение состояния будет сделано в статическом классе основным приложением, оно также будет отражено в dll при попытке использовать этот класс.

Предположим, что пакет Nuget содержит:

namespace Package{
   public static class SomeClass{
      public static int A {get; set;}
      public static void Change(int x){ A = x; }
   }
}

Основное приложение может быть как:

using Package;

namespace MainApp{
  public static void Main(string[] args){
    SomeClass.Change(5);
    DllClass c = new DllClass();
    Console.WriteLine(c.DllFunc());
  }
}

Функция dll определяется как:

using Package;

public class DllClass{
    public DllClass() {}
    public int DllFunc() { return SomeClass.A; }
}

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Да.Сборка загружается только один раз для данного AppDomain, и любая статическая инициализация определенного статического класса происходит при первом обращении к нему.

В вашем примере кода статические инициализаторы Package.SomeClass будут выполняться, когда MainApp.Main() стартует, а затем SomeClass.Change() выполнится.Все остальные видят это изменение.

0 голосов
/ 05 июля 2019

Да, статические поля (не классы) существуют только один раз во всем приложении, если только вы не делаете какой-то прикольной вещи (например, дополнительные домены приложений).

Обычно вы не разделяете «классы», а скорее данные, которыехранятся в полях в этих классах.

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

...