我正在学习C#,我正在尝试将颜色方案/主题放入Multidimentional Array中,以便我可以从任何其他类中访问它们。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace sFirstApp
{
public class colorSchemes
{
string[,] colorBase = new string[3, 4];
colorBase[0, 0] = "D60000"; //Main Background.
colorBase[0, 1] = "DB3E25"; //Text Color.
colorBase[0, 2] = "FF5940"; //Text Shadow.
}
}
Visual Studio一直说: 名称' colorBase'在当前背景下不存在。
我的问题在哪里?这类课程叫做什么?
我尝试使用2D数组的原因也是因为我希望数组的第一维指定主题#。
我打算将App Settings中的Theme#存储为数字,然后只使用2D数组:
ColorTheme [主题#] [主题元素]
答案 0 :(得分:5)
不要使用数组索引任意地表示某个位置以外的东西。
为每种颜色使用命名属性,甚至更好,使用System.Drawing.Color
。
对于可维护的现代C#来说,这将是一个很好的风格:
namespace FirstApp
{
public static class ColorSchemes
{
public struct ThemeColors
{
public Color MainBackground { get; internal set; }
public Color TextColor { get; internal set; }
public Color TextShadow { get; internal set; }
}
private static readonly ThemeColors[] Colors =
{
new ThemeColors
{
MainBackground = Color.FromArgb(0xD6, 0x00, 0x00),
TextColor = Color.FromArgb(0xDB, 0x3E, 0x25),
TextShadow = Color.FromArgb(0xFF, 0x59, 0x40)
}
};
public static ThemeColors GetThemeColors(int themeIndex)
{
if (themeIndex < 0 || themeIndex >= Colors.Length)
throw new ArgumentOutOfRangeException();
return Colors[themeIndex];
}
}
}
现在可以使用简单易读的ColorSchemes.GetThemeColors(0).TextColor
访问颜色。它们也可以动态地从其他位置加载,而不会使用properties破坏API。可以简单地添加其他主题。
对于正确的面向对象设计,应该有一个Theme
类,在请求其颜色时返回ThemeColors
结构,而不是使用静态ColorSchemes
类。
这可以像这样实现(请记住显式构造函数应该用于其中的大部分内容):
namespace FirstApp
{
public class Theme
{
public struct ThemeColors
{
public Color MainBackground { get; internal set; }
public Color TextColor { get; internal set; }
public Color TextShadow { get; internal set; }
}
// Example other property
public string Name { get; set; }
public ThemeColors Colors { get; set; }
}
public static class DefaultThemes
{
public static Theme MainTheme =>
new Theme
{
Name = "Main Theme",
Colors = new ThemeColors
{
MainBackground = Color.FromArgb(0xD6, 0x00, 0x00),
TextColor = Color.FromArgb(0xDB, 0x3E, 0x25),
TextShadow = Color.FromArgb(0xFF, 0x59, 0x40)
}
};
}
}
然后,你有DefaultThemes.MainTheme.Colors.TextShadow
。
答案 1 :(得分:2)
您可以在数组的类中创建一个公共方法。
public string GetColorBase(int position1, int position2){
return colorBase[position1, position2];
}
然后使用该方法,例如
colorSchemes oColorSchemes = new colorSchemes();
string ColorBase = oColorSchemes.GetColorBase(0, 1);
感谢@JeremyKato进行更正
答案 2 :(得分:0)
这可以通过标记数组public
public string[,] colorBase = new string[3, 4];
colorBase[0, 0] = "D60000"; //Main Background.
colorBase[0, 1] = "DB3E25"; //Text Color.
colorBase[0, 2] = "FF5940"; //Text Shadow.
要使用其他命名空间中的类,您需要在顶部添加以下using语句。有关访问修饰符的更多信息,请访问here
using sFirstApp;
从应用程序内的其他位置,您可以说:
var theme = new colorSchemes();
var colors = theme.colorBase;