C#如何在不同的方法中使用相同的变量?

时间:2017-05-08 17:01:15

标签: c# variables

需要你的帮助,正如你从下面的代码中看到的,我不是编码器/程序员大声笑,但我需要你创建这个“实用程序”DLL,由一个简单地调用Utilities的控制台应用程序使用。 FileTasks();

我在声明变量和启动什么类型的方法(public static void,static void,public void,public string等)时遇到了一些问题。我只是希望能够创建“全局变量”(我知道这是编码的一个不好的例子),这样我就可以在不同的地方使用相同的变量,而不是一遍又一遍地声明相同的变量,我想要开发的方法。

我可以请一点帮助吗?

public class Utilities
{
    //Search Directory
    DirectoryInfo di { get; set; }

    //newName should be a var type variable
    EnvironmentVariableTarget newName { get; set; }

    string version { get; set; }



   void ZippingFile(string path)
    {
        System.IO.Compression.ZipFile.ExtractToDirectory(@"C:\Users\developer\Desktop\" + newName, @"C:\Users\developer\Desktop\TempExtract\XPTO");
        System.IO.Compression.ZipFile.ExtractToDirectory(@"C:\Users\developer\Desktop\TempExtract\XPTO\payload_" + version, @"C:\Users\developer\Desktop\TempExtract\XPTO\payload\");
    }

    public static void FileTasks()
    {
        //Search Directory
        DirectoryInfo di = new DirectoryInfo(@"C:\Users\developer\Desktop\");

        //Get file name
        FileInfo[] files = di.GetFiles("XPTO*.exe", SearchOption.TopDirectoryOnly);

        //Convert to string
        string FileName = files[0].ToString();

        //Output
        Console.WriteLine("Fetching file name: {0}", FileName);

        //File rename
        var sourcePath = @"C:\Users\developer\Desktop\" + FileName;
        var newName = FileName + ".zip";
        var directory = Path.GetDirectoryName(sourcePath);
        var destinationPath = Path.Combine(directory, newName);
        File.Move(sourcePath, destinationPath);
        Console.WriteLine("File renamed to: " + newName);

        //Create directory and extract Zip
        string TempExtract = "C:\\Users\\developer\\Desktop\\TempExtract\\";

        if (Directory.Exists(TempExtract) && (newName.StartsWith("XPTO_")))
        {
            Directory.Delete(TempExtract, true);
            Console.WriteLine("Directory existed and it was deleted");
            Directory.CreateDirectory(TempExtract + "\\XPTO");
            Console.WriteLine("Directory " + TempExtract + "\\XPTO" + " was created");
        }
        else if (Directory.Exists(TempExtract) && (newName.StartsWith("XPTO2_")))
        {
            Directory.Delete(TempExtract, true);
            Console.WriteLine("Directory existed and it was deleted");
            Directory.CreateDirectory(TempExtract + "\\XPTO2");
            Console.WriteLine("Directory " + TempExtract + "\\XPTO2" + " was created");
        }
        else if (newName.StartsWith("XPTO_"))
        {
            Console.WriteLine("Directory doesn't exist");
            Directory.CreateDirectory(TempExtract + "\\XPTO");
            Console.WriteLine("Directory " + TempExtract + "\\XPTO" + " was created");
        }
        else if (newName.StartsWith("XPTO2_"))
        {
            Console.WriteLine("Directory doesn't exist");
            Directory.CreateDirectory(TempExtract + "\\XPTO2");
            Console.WriteLine("Directory " + TempExtract + "\\XPTO2" + " was created");
        }

        if (newName.StartsWith("XPTO_"))
        {

            ZippingFile(@"C:\Users\developer\Desktop\XPTO");
        }

        else if (newName.StartsWith("XPTO2_"))
        {
            ZippingFile(@"C:\Users\developer\Desktop\XPTO2");
        }


    }
}

1 个答案:

答案 0 :(得分:0)

这似乎是XY problem的经典案例。

这是一种非常糟糕的方法来节省一点点打字。如果你真的看它,它甚至不会为你节省很多打字;你还是要做作业。所以区别在于字面意思:

public class SomeClass {
  public string abc;

  public foo() {
     abc = "something";
  )

}

VS

public class SomeClass {
     public foo() {
        var abc = "something";
     )
}

所以它甚至不能为你节省很多打字。变量的实际声明几乎不比变量的赋值更长,这不会阻止你做。

其他几点:

首先,严格地说,C#没有"全局变量"就像C和C ++一样。你可以编写有效全局变量的东西(有一些警告),但是(public static变量和Singleton类)。

话虽如此,首先使用其中任何一个通常是可怕的练习;在绝大多数情况下,单身人士和全局变量都是一个反模式(除非你处理的情况是真实而且真正只是特定资源之一并且你别无选择 - 例如,如果你'重新与物理设备交互,并且只有一个物理设备。它很快就会很难非常难以跟踪变量的状态,实际上是在寻求不可维护的意大利面条代码。

另一个问题:你提出的建议会增加内存消耗,因为全局变量中的对象不能被垃圾收集,除非你明确地将其值设置为null(这会增加如果你刚刚把它作为一个局部变量,那么打字的数量超过了你必须要做的事情。如果您只是使用一个或两个字符串来执行此操作,那么就内存消耗而言,这可能不是什么大问题,但如果您使用它,它可能会成为巨大的交易。使用较大的对象,大量对象或保留共享,有限或非托管资源的对象来执行此操作。

这让我回到原来的观点:不要这样做。只是不要。保存极少量的输入是真正糟糕的方法。