如何从另一个类引用函数的变量? - C#

时间:2012-12-10 10:47:15

标签: c#

我有一段时间从我的Game1(主)类中可用的另一个类的函数中获取变量。具体来说,我想从SetWindowSize.cs中的SaveData函数中获取宽度和高度,并在Game1.cs中的ReadSettings中使用它。

我收到错误

  

'ShovelShovel.SetWindowSize'不包含。的定义   '高度'。 “宽度”相同。

Game1.cs(仅限该功能)

protected void ReadSettings()
{
    try
    {
        if (File.Exists(SetWindowSize.savePath))
        {
            using (FileStream fileStream = new FileStream(SetWindowSize.savePath,
                                                          FileMode.Open))
            {
                using (BinaryReader binaryReader = new BinaryReader(fileStream))
                {
                    SetWindowSize.width = binaryReader.ReadInt32();
                    SetWindowSize.height = binaryReader.ReadInt32();
                }
            }
        }
    }
    catch
    {
    }
}

SetWindowSize.cs

namespace ShovelShovel
{
            protected void ReadSettings()
    {
        try
        {
            if (File.Exists(savePath))
            {
                using (FileStream fileStream = new FileStream(savePath, FileMode.Open))
                {
                    using (BinaryReader binaryReader = new BinaryReader(fileStream))
                    {
                        var windowSize = WindowSizeStorage.ReadSettings();

                        WindowSize.Width = windowSize.Width;
                        WindowSize.Height = windowSize.Height;
                    }
                }
            }
        }
        catch
        {
        }
    }

非常感谢能够帮助我的每个人,我真的很感激。

4 个答案:

答案 0 :(得分:1)

这可能会起到作用:

public class WindowSize
{
    public int Width { get; set; }
    public int Height { get; set; }
}

public static class WindowSizeStorage
{
    public static string savePath = "WindowSize.dat";

    public static WindowSize ReadSettings()
    {   
        var result = new WindowSize();
        using (FileStream fileStream = new FileStream(SetWindowSize.savePath, FileMode.Open))
        {
            using (BinaryReader binaryReader = new BinaryReader(fileStream))
            {
                result.Width = binaryReader.ReadInt32();
                result.Height = binaryReader.ReadInt32();
            }
        }

        return result;
    }

    public static void WriteSettings(WindowSize toSave)
    {
        using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(savePath, FileMode.Create)))
        {
            binaryWriter.Write(toSave.Width);
            binaryWriter.Write(toSave.Height);
        }
    }
}

用法:

// Read
var windowSize = WindowSizeStorage.ReadSettings();

myForm.Width = windowSize.Width;
myForm.Height = windowSize.Height;

// Write
var windowSize = new WindowSize { Width = myForm.Width, Height = myForm.Height };

WindowSizeStorage.WriteSettings(windowSize);

请注意,写这样的答案(提供所有代码)并不常见;我只是觉得这样。我试图展示一些面向对象的设计原则,每个类都有自己的东西。

如果要在方法之间传输复杂对象(即多个基本类型),通常会创建像WindowSize这样的数据传输对象(DTO)。

WindowSizeStorage类完全负责存储和检索此类WindowSize对象。从您的代码中,您只需告诉存储器存储或检索您想要的设置。

但是当我从您的问题和评论中得到答案时,您在使用C#或者根本没有任何编程经验方面没有太多经验。尝试学习一两个教程,这样你就可以理解如何将你的想法付诸代码。

答案 1 :(得分:0)

您无法在该功能之外访问Function变量。 要实现这些定义静态变量,请为静态变量分配高度和宽度,然后在任意位置访问它。

答案 2 :(得分:0)

函数的目的不是存储和公开变量。如果范围不够宽,则无法访问变量。在您的情况下,您应该通过将它们存储在类中并将它们公开来以某种方式公开它们,例如:

class SetWindowSize
{
    public const string savePath = "file.dat";

    public int width {get; set; }
    public int height {get; set; }

    public static void SaveData(string width, string height)
    {            
        using (BinaryWriter binaryWriter = new BinaryWriter(File.Open(savePath, FileMode.Create)))
        {
            binaryWriter.Write(width);
            binaryWriter.Write(height);
            SetWindowSize.width = width;
            SetWindowSize.height = height;
        }
    }
}
}

这远非最佳,但它确实有效。

答案 3 :(得分:0)

您的SetWindowSize类不包含width或height成员。您可以将它们添加为属性:

public class SetWindowSize
{
// other stuff
public int Height {get;set;}
public int Width {get;set;}
// other stuff
}

然后您可以使用SetWindowSize实例访问它们:

SetWindowSize sws = new SetWindowSize();
sws.Height = 512;
sws.Width = 512;