2013-05-14 3 views
1

Хорошо, я здесь, вне зоны комфорта, и борюсь с новыми концепциями, но надеюсь, что смогу проясниться.
Как я понимаю, глобальные переменные очень плохи в C# (и опасны вообще), но я действительно не хочу вступать в эту дискуссию. После некоторого research я убежден, что Singletons может помочь. Пожалуйста, не стесняйтесь предлагать альтернативы здесь, если это неправильно с ситуацией, описанной ниже.

Что я пытаюсь сделать, так это создать динамический многомерный array, который будет содержать числовые данные. Эта матрица будет различаться по размеру и должна быть создана во время выполнения (я извлекаю данные из устройства регистрации через графический интерфейс).
То, что я вижу в качестве решения, состоит в том, чтобы создать class, который имеет переменную, которая может я могу get и set, но с динамическим размером.Динамическая длина массива с использованием Singleton

public class mySingleton 
{ 
    public static int dataSize { get; set; } 
    public double[] dataSet = new double[dataSize] { get; set; }    
} 

Что-то в этом роде, но очевидно, что это неправильно и не работает. Я пытался исследовать, как инициализировать массив во время выполнения, но не могу понять, но я также чувствую, что не знаю, какие условия для поиска. Любая помощь?

+2

Любые причины, по которым вам нужно использовать массив вместо 'List '? (не то, что это действительно поможет с вопросом singleton) –

+0

Не совсем; это было произвольное решение. Насколько я понимаю, разница не так велика, но массив быстрее, чем список? Опять же, это понятия вне моей зоны комфорта - я все еще учусь. – tmwoods

+0

@tmwoods Быстрее? Конечно. Но вы преждевременно микроуправляетесь? Похоже на это. Я бы пошел со списком до тех пор, пока не появится проблема с производительностью, и список окажется в виде горлышка бутылки. –

ответ

3

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

public class mySingleton 
{ 
    private static int _dataSize; // you might want to set this to some sensible default 
    public static int DataSize 
    { 
     get { return _dataSize; } 
     set 
     { 
      _dataSize = value; 
      _dataSet = null;  // changing the size will implicitly clear the array - but you could write code to resize if you really wanted to 
     } 
    } 
    private static double[] _dataSet; 
    public static double[] DataSet 
    { 
     get 
     { 
      if (_dataSet == null) 
      { 
       _dataSet = new double[_dataSize]; 
      } 
      return _dataSet; 
     } 
     // you can include a setter if you want to let the consumer set the dataset directly - in which case it should update the _dataSize field. 
    }    
} 
2

Возможно, вы захотите инициализировать массив в ответ на метод set в свойстве dataSize. Вы не сможете использовать быстрые свойства «автозаполнения» («get; set;»), но таким образом вы сможете инициализировать набор данных, как только пользователь установит размер данных.

Так что-то вроде этого:

public class mySingleton 
{ 
    private static int _dataSize; 
    public static int dataSize { 
     get {return _dataSize;} 
     set { 
      _dataSize = value; 
      dataSet = new double[value]; 
     } 
    } 
    public double[] dataSet { get; private set; }    
} 

В общем, чтобы установить статическое свойство класса, вы можете использовать статический конструктор (http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx) или для управления потоком доступа к классу/данные в виде способ, которым вы можете настроить статические члены, прежде чем кому-то еще понадобится их использовать.

0

Я не уверен, если Singleton лучше всего подходит для вашего подхода, но в любом случае, здесь Singleton Реализация:

public class MatrixSingleton 
{ 
    private static readonly MatrixSingleton instance = new MatrixSingleton(); 

    static MatrixSingleton() 
    { 
    } 

    private MatrixSingleton() 
    { 
     this.Data = new List<Tuple<double, double>>(); 
    } 

    public static MatrixSingleton Instance 
    { 
     get { return instance; } 

    } 

    public List<Tuple<double, double>> Data; 

} 

и использования его

MatrixSingleton matrixSingleton = MatrixSingleton.Instance; 
matrixSingleton.Data.Add(new Tuple<double, double>(1.1, 2.2)); 

Для получения дополнительных сведений о Singleton шаблон эти ссылки могут помочь:

http://braindrivendevelopment.com/2013/05/04/simplify-singleton-pattern/

http://www.csharpindepth.com/Articles/General/Singleton.aspx

1

Вы можете создать массив динамического размера легко:

double[] array = new double[size]; 

size может быть любое произвольное выражение типа int. Таким образом, ваш код будет выглядеть так:

class ArrayHolder { public static double[] Value; } //global state 

//set the global state somewhere else in your code: 
var size = DetermineSize(); 
double[] array = new double[size]; 
ArrayHolder.Value = array; //publish globally 

После инициализации массива он доступен во всей программе. Массивы являются ссылочными типами, поэтому здесь нет ненужного копирования данных.

Sidenote: Почему вы предпочитаете синглтон для статической переменной? Часто у них есть те же плюсы и минусы (IOW нет значимой разницы). В моем примере я просто использовал статическую переменную.

+0

Я не могу на самом деле оправдать, почему я пошел так, чтобы не читать, что синглтоны были лучшим методом. Я как бы стоя на плечах здесь. – tmwoods

+0

@tmwoods Я полностью понимаю это. Просто пытаюсь вести вас. – usr

+0

И я ценю это :) – tmwoods

Смежные вопросы