2010-07-02 106 views
2
int hour = DateTime.Now.Hour; 
ViewData["greeting"] = (hour < 12 ? "Good morning" : "Good afternoon"); 

对不起noob问题,但我正在阅读的ASP.NET MVC书籍假设我已经知道C#(但我不知道)。这行C#代码是做什么的?

我了解第一部分 - 它将当前日期和时间分配给小时变量。但是我迷失在二线。那些<, ?, :符号是什么? ViewData [“greeting”]这是一个什么样的数组?

谢谢!

+15

你应该先学C#。 – SLaks 2010-07-02 22:33:50

+0

@Robert?如果你正在阅读的书假设你知道X,那么在阅读之前你应该知道X.这很简单:p – 2010-07-02 22:36:51

回答

18

如果小时小于12,则ViewDate [“greeting”]被分配值“早上好”。否则,它会被分配一个“下午好”的值。

?:位是conditional operator。 MSDN给出了一个很好的描述:

条件运算符(:)返回取决于布尔表达式的值 两个值中的一个 。

+0

也被称为“三元运算符” – 2010-07-03 02:05:10

+0

称为“A”三元运算符...不是“三元运算符”。由于大多数语言通常在语言中只有一个三元运算符,它有时简称为“三元运算符”,但事实并非如此。条件运算符是一个三元运算符。 – Sivvy 2010-07-16 17:34:39

5

它是if声明的简短版本。

if (hour < 12) 
    ViewData["Greeting"] = "Good Morning"; 
else 
    ViewData["Greeting"] = "Good afternoon"; 
+3

虽然这与定期的if语句有点不同,您不能在赋值运算符之后或其他表达式中嵌入常规if语句。 – 2010-07-02 22:39:10

2

基本上是说,如果小时< 12用“早上好”,否则用“下午好” - 像if语句内联。

1

这是另一种形式的“if else”。问号左侧的陈述表示if语句,ViewData["greeting"]如果为真,则分配“:”左侧的值,如果为真,则分配“:”右侧的值。

1

Larsenal的回答是正确的。更一般地,? ... : ...是基于C的语言中的if的简写符号。它可能会降低可读性,但好处在于,您可以在赋值运算符之后使用它,如您的示例中所示。

1

只是为了回答你的问题的另一部分,你问什么符号分别为: < =小于(因此是低于每小时12) :=三元(http://en.wikipedia.org/wiki/Ternary_operation)基本上是说,如果if语句(小时< 12)= true然后使用问题makr后的值,如果冒号后没有使用值。

8

The?被称为条件运算符。

它充当if-then-else语句,唯一不同的是它在评估时实际返回了某些内容。

采取这个简单的例子:

// ex 1 
if (condition) 
    name = "Female"; 
else 
    name = "Male"; 

// ex 2 
name = condition ? "Female" : "Male"; 

这两个例子是相同的。条件运算符由两个子句(条件除外)组成,前一个和后一个冒号: - before是在条件== true上评估的,而after是在条件== false上评估的。

<只是一个操作符,用于检查左侧是否小于右侧。1 < 2 == true,而3 < 2 == false。

ViewData [“greeting”]就是数组ViewData中索引为greeting的项目。

整个代码只是根据当前时间分配一个问候消息。

编辑: 如上所述,int hour = DateTime.Now.Hour;当前小时(0-23)分配给整数变量hour

1

<符号是从数学好“醇男孩,被称为‘小于’ 的?连同:就是我们所说的"Ternary Operator" or "Conditional Operator"基本上,它就像内嵌的if-then-else语句。

if (5 > 2) 
    dosomething(); 
else 
    dosomethingelse(); 

可以写成

(5 > 2) ? dosomething() : dosomethingelse(); 

所以,这是什么代码正在做的是根据时钟获取当前的小时, 检查,看它是否是中午12点(又名中午)之前,和相应地分配问候语。

4

我了解第一部分 - 它将当前日期和时间分配给小时变量。

这并不完全正确。让我们分析表达式右边的每个部分:

DateTime - 这是一个用于存储和操作具有日期和时间组件的值的类型(类)。

Now - 这是DateTime类型的静态成员。这意味着你不使用特定的实例来访问它,而是使用类型本身的名称。这个静态成员返回一个新的DateTime实例,填充当前的日期和时间。请注意,一旦创建此实例不会改变;几行代码后来它已经过时了。

Hour - 这将返回一个数字,指示24小时格式的DateTime实例的Hour部分(0是午夜,13是1pm)。

所以,合起来,这会返回一个代表当前小时的数字。将其与解释条件操作符和小于操作符的其他答案结合起来,代码应该更有意义。如果小时大于12,则在中午之后。

这仍然离开ViewData[]。 ViewData是一种特殊类型的字典类型(按键索引的键/值对),用于将数据从MVC控制器传递到MVC视图。

1

以及我不是在C#好,但它很清楚这个代码:

第一线获取当前小时。这意味着:如果其7时,该varialble的值“小时”将被设定为7:

int hour = DateTime.Now.Hour; 

“的ViewData”是显然的阵列保持一些字符串数据。 “问候”指数的值将设置为“早上好”,如果在12点之前,则为“下午好”,否则......

ViewData["greeting"] = (hour < 12 ? "Good morning" : "Good afternoon"); 

准确的说,

ViewData["greeting"] = (hour < 12 ? "Good morning" : "Good afternoon"); 

等于

if(hour < 12) 
    ViewData["greeting"] = "Good morning"; 
else 
    ViewData["greeting"] = "Good afternoon"; 

,如果这是比较容易理解...