【问题标题】:Syntax confusion in C#C#中的语法混淆
【发布时间】:2013-10-09 06:11:44
【问题描述】:

所以我正在研究一个调用我以前从未见过的函数的项目,而我才刚刚开始熟悉 C# 语法。我使用 Python 和 Javascript 已经有几个星期了,而且我对它们的经验更接近了,但是这种语法仍然让我感到困惑。

private static void GENERIC_FUNCTION_NAME(string[] args)
    {
        GENERIC_OBJECT_NAME.OTHER_GENERIC_FUNCTION_NAME();

        string path = args == null || args.Length == 0 ?
            @"C:\GENERIC\SYSTEM\PATH" :
            args[1];

        var GENERIC_VARIABLE_NAME = new GENERIC_OBJECT_NAME();
        GENERIC_VARIABLE_NAME.Open(path);
    }

我对这个函数的参数语法感到困惑。

你看,这个函数是在一个 C# 控制台应用程序中编写的,并且项目中有很多 C++ 组件来完成它要触发的工作。但是我被告知要为它构建一个 GUI 来实现相同的目标。我什至不确定什么会以args 的形式传递...因为我在此代码旁边的脚本中的任何地方都看不到它,这是Program.cs 中唯一的函数,它是在我获取文件时编写的一起工作。

因此,我无法让按钮连接到此功能。我不知道如何集成object sender, EventArgs e以便可以连接按钮(如果我直接这样做,即“(object sender, EventArgs e, string[] args)”,我会收到错误消息。我做错了什么?我该如何集成函数并使其按钮可寻址?

编辑:我已将有关三元运算符here 的问题移至未来读者的理智。如果您愿意,请重新发表您对此的意见,因为你们已经在这里帮助过我。

【问题讨论】:

  • 最后一个问题是ternary operatormsdn.microsoft.com/en-us/library/ty67wk28.aspx
  • 那么按照condition ? first_expression : second_expression;的结构,条件是string path = args == null || args.Length == 0firstsecond表达式分别是@"C:\GENERIC\SYSTEM\PATH"args[1]?
  • 很高兴看到那些开发人员不相信方法的命名约定 :)
  • main函数的args包含用户在启动程序时在命令行输入的文本;见Command Line Parameters。 Python 也有类似的行为,虽然更隐蔽;您可以通过sys.argv 访问命令行参数
  • 对于您问题的第一部分,如果您双击按钮(假设您使用的是 Visual Studio),它将自动进行点击回调。在该回调中,您可以调用 GENERIC_FUNCTION_NAME。不过,我不确定你会从哪里得到 string[] 。我们需要更多信息。

标签: c# syntax


【解决方案1】:

我可以帮助解决语法问题。

字符串路径等于@"C:\GENERIC\​​SYSTEM\PATH" OR (:) args[1]

如果 args == null 或 args.length == 0 则确定哪一个,然后使用 @"C:\GENERIC\​​SYSTEM\PATH" 如果不是,则使用 args[1] 和下面的一样

if(args == null || args.Length == 0)
{
    string path = @"C:\GENERIC\SYSTEM\PATH" ;
}
else{
    string path = args[1];
}

这里有一些延伸阅读http://msdn.microsoft.com/en-us/library/ty67wk28.aspx

【讨论】:

  • 顺便说一句,我你会希望在if/else 块之外声明path,因为否则它将无法在外部访问。
  • 谢谢你!但是,为了清楚起见,我将问题拆分并放入三元运算符问题here。如果您可以在此处重新发布此答案,我将可以对其进行投票。
  • 更多的是为了演示三元运算符的含义。但是是的,你是对的
  • 没关系,您可以标记许多其他答案之一!和@Cyral一起去,他似乎很渴望!
  • 没问题,这是我的荣幸
【解决方案2】:

我假设你的方法被称为Main,并且默认情况下是Program.cs中的唯一方法

这个main方法在程序执行时接受参数,比如通过CMD运行带有app.exe -myArg等可选参数,并被翻译成字符串数组。 command line parameters 上查看更多信息。

如果没有,您可以右键单击方法名称,然后查看所有引用,或查找调用层次结构以找出调用它的原因。

对于您的第二个问题... 您看到的是一个特殊的条件运算符,ternary operator。 (而here 是一个不错的教程)

这样使用:

condition ? first_expression : second_expression;

如果语句为真,则执行第一个表达式,否则执行第二个。一般来说,它是if/else 块的一个小快捷方式,应该只用于小语句。嵌套三元运算符在很大程度上是不受欢迎的。

所以如果args == null || args.Length == 0 然后path = @"C:\GENERIC\SYSTEM\PATH",如果不是,则等于args[1]

相当于你的标准if

string path;
if(args == null || args.Length == 0)
{
   path = @"C:\GENERIC\SYSTEM\PATH";
}
else
{
   path = args[1];
}

现在已经处理好了,如果您在设计器中双击按钮,它将带您(或生成)一个在单击按钮时执行的方法。从那里你可以用它的参数调用这个方法(如果是main,我不确定你为什么要这样做。但我不确定我是否完全理解这个问题)

【讨论】:

  • 您对这个方法完全正确——它被称为Main,它是Program.cs 中唯一的方法。我根本不习惯 Visual Studio 中基本演示程序之外的任何东西,所以如果我想基于它“创建一个等效的 GUI”,我不知道它应该在我的项目中去哪里。我还有另一个Program.cs,但不知道如何将此示例代码与我自己的Form1 正确合并。你不知道在那种情况下我想做什么,是吗?
  • 您能否详细解释一下您的解决方案的布局?您的 Form1 也有自己的类。
  • 我的雇主给了我一个解决方案,其中包含四个不同的项目:一个是一个 C++ .dll,它包装了自始至终使用的 zlib 方法。一个是处理我们访问的通用类型的存储文件的 C# 互操作代码。一个是从上述存储文件的特定类型中提取数据的 C# 库。最后一个是简化的控制台应用程序,从中复制/粘贴了此代码,并提供了调用先前建立的库以检查流的示例。
  • 如果我理解正确,我需要编写一个可以调用这些库的 GUI,但是当我的示例是控制台应用程序时,我不知道该怎么做,并且我应该访问Windows 窗体应用程序中的相同库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2017-03-13
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多