C#:如何使类中的数组可以从其他类访问?

时间:2016-06-08 18:45:08

标签: c#

我正在学习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 [主题#] [主题元素]

3 个答案:

答案 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;