简体   繁体   English

C#中的命令行参数

[英]Command line arguments in c#

I am pretty new to c# . 我对c#很陌生。 Got a problem with command line arguments. 命令行参数出现问题。 what i want to do is make use of the third cmd line argument and write to it. 我想做的是利用第三个cmd行参数并将其写入。 I have specified the path of the file I want to write into and other stuffs. 我已经指定了要写入的文件的路径以及其他内容。 But the question here is can i access the command line arguments(for eg; args[3]) from user defined functions? 但是这里的问题是我可以从用户定义的函数访问命令行参数(例如args [3])吗? How do we do tat? 我们该怎么做? below is my code. 下面是我的代码。

public class Nodes
{
public bool isVisited;
public string parent;
public string[] neighbour;
public int nodeValue;

public Nodes(string[] arr, int nodeValue)
{
    this.neighbour = new string[arr.Length];
    for (int x = 0; x < arr.Length; x++)
        this.neighbour[x] = arr[x];//hi...works??
    this.isVisited = false;
    this.nodeValue = nodeValue;
}


}

public class DFS
{
static List<string> traversedList = new List<string>();

static List<string> parentList = new List<string>();
static BufferBlock<Object> buffer = new BufferBlock<object>();
static BufferBlock<Object> buffer1 = new BufferBlock<object>();
static BufferBlock<Object> buffer3 = new BufferBlock<object>();
static BufferBlock<Object> buffer2 = new BufferBlock<object>();

public static void Main(string[] args)
{

    int N = 100;
    int M = N * 4;
    int P = N * 16;

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    List<string> global_list = new List<string>();


    StreamReader file = new StreamReader(args[2]);

    string text = file.ReadToEnd();

    string[] lines = text.Split('\n');


    string[][] array1 = new string[lines.Length][];
    Nodes[] dfsNodes = new Nodes[lines.Length];

    for (int i = 0; i < lines.Length; i++)
    {
        lines[i] = lines[i].Trim();
        string[] words = lines[i].Split(' ');

        array1[i] = new string[words.Length];
        dfsNodes[i] = new Nodes(words, i);
        for (int j = 0; j < words.Length; j++)
        {
            array1[i][j] = words[j];
        }
    }
    StreamWriter sr = new StreamWriter(args[4]);

    int startNode = int.Parse(args[3]);

    if (args[1].Equals("a1"))
    {
        Console.WriteLine("algo 0");
        buffer.Post(1);
        dfs(dfsNodes, startNode, "root");
    }
    else if (args[1].Equals("a2"))
    {
        Console.WriteLine("algo 1");
        buffer1.Post(1);
        dfs1(dfsNodes, startNode, "root",sr);
    }
    else if (args[1].Equals("a3"))
    {
        buffer3.Post(1);
        List<string> visitedtList = new List<string>();
        Console.WriteLine("algo 2");
        dfs2(dfsNodes, startNode, "root", visitedtList,sr);
    }

    stopwatch.Stop();

    Console.WriteLine(stopwatch.Elapsed);
    Console.ReadLine();
}

public static void dfs(Nodes[] node, int value, string parent,StreamWriter sr1)
{
    int id = (int)buffer.Receive();
    sr1=new StreamWriter(arg
    Console.WriteLine("Node:" + value + " Parent:" + parent + " Id:" + id);
    sr1.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    id++;
    traversedList.Add(value.ToString());
    buffer.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        if (!traversedList.Contains(node[value].neighbour[z]))
        {
            dfs(node, int.Parse(node[value].neighbour[z]), value.ToString(),sr1);
        }

    }
    return;



}

public static void dfs1(Nodes[] node, int value, string parent, StreamWriter sr)
{
    int id = (int)buffer1.Receive();
    sr.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    node[value].isVisited = true;
    node[value].parent = parent;
    id++;
    buffer1.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        buffer2.Post(node[int.Parse(node[value].neighbour[z])]);
        if (!isVisited())
        {
            dfs1(node, int.Parse(node[value].neighbour[z]), value.ToString(),sr);
        }

    }
    return;



}

public static void dfs2(Nodes[] node, int value, string parent, List<string> visitedtList, StreamWriter sr)
{
    int id = (int)buffer3.Receive();
    sr.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    id++;
    visitedtList.Add(value.ToString());
    buffer3.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        buffer2.Post(node[int.Parse(node[value].neighbour[z])]);
        if (!visitedtList.Contains(node[value].neighbour[z]))
            dfs2(node, int.Parse(node[value].neighbour[z]), value.ToString(), visitedtList,sr);

    }
    return;



}

public static bool isVisited()
{
    Nodes node = (Nodes)buffer2.Receive();
    return node.isVisited;
}

}

So the thing is I want to write the output of each dfs to the file specified as the command line argument. 因此,我想将每个dfs的输出写入指定为命令行参数的文件中。 So can I have access to the args in the dfs, dfs1 methods??? 所以我可以访问dfs,dfs1方法中的args吗??? Thank you. 谢谢。

您可以保留一个静态字段来保存它,也可以只使用Environment.GetCommandLineArgs()

Well, in its simplest form, just save it to use later 好吧,以最简单的形式,将其保存以备后用

class Program
{
    static string _fpath;
    static void Main(string[] args)
    {
        // ...stuff
        _fpath = args[3];
    }

    static void WriteFile()
    {
        using(var stream = File.Open(_fpath, ...))
        {
            // write to file
        }
    }
}

Not necessarily exactly how I would do it, but you get the idea. 不一定确切我会怎么做,但是您明白了。

Also, regarding this bit of code... 另外,关于这段代码...

this.neighbour = new string[arr.Length];
for (int x = 0; x < arr.Length; x++)
    this.neighbour[x] = arr[x];//hi...works??

You can simply write 你可以简单地写

this.neighbour = arr;

Ahh, the wonders of managed code :D. 啊,托管代码的奇迹:D。 No need to copy elements across to the second array. 无需将元素复制到第二个数组。 Of course, you need to consider the fact that changes to elements in the argument array ( arr ) will be reflected in your internal array now. 当然,您需要考虑以下事实:对参数数组( arr )中元素的更改现在将反映在内部数组中。

It would be better to pass arguments into functions instead of relying on some "hidden" way to pass them. 最好将参数传递给函数,而不要依靠某种“隐藏”的方式传递参数。

Both static variable and GetCommandLineArgs are useful to pass them in hidden way (as pointed out in other answers). 静态变量和GetCommandLineArgs均可用于以隐藏方式传递它们(如其他答案所指出)。 Drawbacks are harder to test (since need to set static shared dependency) and less clear for future readers that there is this hidden dependency. 缺点很难测试(因为需要设置静态共享依赖项),并且对将来的读者来说不清楚存在这种隐藏的依赖项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM