2017-02-01 9 views
2

Я хотел бы реализовать структуру, которая содержит определенный цвет, выпущенный из System.Drawing.Color. Вот мой последний код.Наличие статической переменной, называемой аргументом

namespace ColorSystem 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    internal void testfunc(Label lbl, System.Drawing.Color newcolor) 
    { 
     lbl.BackColor = newcolor; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var getvalue = ColorValues.NormalFont; 
     testfunc(label1, ColorValues.NormalFont); 
     testfunc(label2, ColorValues.NormalFont2); 
    } 

} 
public static class ColorValues 
{ 
    // Private variable to hold font once instantiated 
    public static System.Drawing.Color NormalFont{ get{ return Color.AliceBlue;}}//Dynamic 
    public static System.Drawing.Color NormalFont2 =   Color.AliceBlue;//static ?? 
} 

То, что я до сих пор не получают то, что разница между этими двумя линиями:

public static System.Drawing.Color NormalFont{ get{ return  Color.AliceBlue;}}//Dynamic 
public static System.Drawing.Color NormalFont2 =   Color.AliceBlue;//static ?? 

Когда я смотрю с мышью, я вижу, что.

What interpreter show me

В чем разница между кубом и рукой? Рука (get) так динамична? и куб - это данные в памяти ... ??

Большое спасибо!

+0

Должно работать, какое исключение вы получаете? –

+0

Слово на struct vs class: https://msdn.microsoft.com/en-us/library/ms229017(v=vs.110).aspx – Fildor

+0

Поэтому, читая эту статью, это означает, что для памяти лучше иметь ссылочный тип (класс), чем тип переменной (struct) .... спасибо. – Jablonovo

ответ

1

Ваш testfunc должен выглядеть следующим образом:

internal void testfunc(Label lbl, ColorValue newcolor) 
{ 
    lbl.BackColor = newcolor.NormalFont; 
} 

Как вы переходящий в вашей структуре? Это должно быть так:

ColorValue colorstruct; 
testfunc(somelabel, colorstruct); 

Кроме того, рассмотреть вопрос об изменении названия NormalFont с момента его не совсем шрифта, но цвет.

0

Я бы использовал статический класс и имел некоторые свойства только для чтения. Только экземпляр цвета, когда они используются, так что ваш класс будет начать со всеми нулями (память не выделяется), то, как вы читаете/получаете каждое свойство, оно будет Instantiate на основе System.Drawing.Color

public static class ColorValues 
{ 
    // Private variable to hold font once instantiated 
    private static System.Drawing.Color _normalFont; 
    public static System.Drawing.Color NormalFont 
    { 
     get 
     { 
      // Only instantiate when needed 
      if (_normalFont == null) 
      { 
       _normalFont = Color.AliceBlue;   
      } 
      return _normalFont; 
     } 
    } 
} 

затем вы можете использовать в вашей форме, как:

private void button1_Click(object sender, EventArgs e) 
    { 
     testfunc(label1, ColorValues.NormalFont); 
    } 

Я попробовал этот

public partial class Form1 : Form 
    { 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    internal void testfunc(Label lbl, ColorValues newcolor) 
    { 
     lbl.BackColor = newcolor; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     testfunc(label1, ColorValues.NormalFont); 
    } 

} 
public static class ColorValues 
{ 
    // Private variable to hold font once instantiated 
    public static System.Drawing.Color NormalFont{ get{ return Color.AliceBlue;}} 
} 
/* public struct ColorValue 
{ 
    public static System.Drawing.Color NormalFont = Color.AliceBlue; 
}*/ 
+0

, но если мой класс Color содержит 1000 определений, было бы неплохо поставить get для каждого? Спасибо – Jablonovo

+0

Да. Помните, что ваш класс ColorValues ​​не будет использовать память до тех пор, пока каждый цвет не будет создан. Еще лучше было бы просто поместить get {return Color.AliceBlue} и даже не хранить ссылку на него в локальной переменной. Таким образом, вы в основном просто «обертываете» кучу цветов, используя свои собственные ярлыки. Это в основном класс темы. – Mangist

+0

Он говорит, что статический тип не может использоваться в качестве параметров .... – Jablonovo

1

Ваш первый пример работает, но тогда вы говорите, что вы хотите сделать ваш метод взять struct ColorValue, как параметр, вы можете это сделать, но вы не можете заполнить BackColor из Label своей структурой, потому что он имеет другой тип, и, как вы догадались, вам придется передать экземпляр вашей структуры, как в последнем примере.

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

Что касается памяти, если вы создали 1000 экземпляров Form1 вы бы 1000 экземпляров ColorValue, но если ваш struct ColorValue останется, как есть, это только 1 byte. Вообще память не проблема.

Редактировать: Какая разница между нижеследующим?

public static System.Drawing.Color NormalFont{ get{ return  Color.AliceBlue;}}//Dynamic 
public static System.Drawing.Color NormalFont2 =   Color.AliceBlue;//static ?? 

Первый - это свойство, а второе - поле. Свойства устанавливают и получают методы, поэтому разница в том, что попытка получить значение свойства вызовет метод get, который вернет вам то, что вы хотите, в то время как поле является прямой ссылкой на то, что вы хотите.Обычно рекомендуется выставлять только свойства и скрывать поля, по сути дела, что вы не можете (или не можете легко) отлаживать/контролировать доступ к полям, в то время как легко отлаживать доступ к свойствам.