占位符在C#中

时间:2017-07-04 17:03:31

标签: c#

   using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace switch_calculator
    {
        class Program
        {
            static void Main(string[] args)
            {
                double num1, num2;
                char opt;

                Console.WriteLine("Enter num1");
                num1 = Convert.ToInt32(Console.ReadLine());

                Console.WriteLine("Enter num2");
                num2 = Convert.ToInt32(Console.ReadLine());

       Console.WriteLine("Select the operation you would like to perform" );
       Console.WriteLine("Press \n 'A' for Add \n 'S' for subtraction
\n 'D' for Division \n 'M' for multiplicatiion \n 'R' for Remainder");

                opt = Convert.ToChar(Console.ReadLine());
                switch(opt)
                {
                    case 'A':

                        Console.WriteLine("your Add result  {0} + {1} is {2}", num1, num2, num1+num2);
                        break;
                }

                Console.ReadLine();

            }
        }
    }
  1. 这是我的C#代码,我是编程的新手,我只是 想知道我可以将占位符值分配给其他数字 在switch case语句中,{0},{7}或{1},{3}而不是{0},{1} 案例A ??有人可以在这里解释占位符概念吗?

4 个答案:

答案 0 :(得分:1)

Console.WriteLine("your Add result  {0} + {1} is {2}", num1, num2, num1+num2);

让我解释一下这里的意思:

Console.WriteLine(string text, params object[] obj);

这是没有值的方法。 如您所见,您可以为其打印一个字符串以及参数列表。

运行此方法时,将填充以下值:

text = "your Add result  {0} + {1} is {2}";
obj  = new object[3];
obj[0] = num1;
obj[1] = num2;
obj[2] = num1+num2;

现在格式化程序所做的是将ToString() - 方法返回的对象的值放在给定的索引处。

让我们假设num14num25

"your Add result  {0} + {1} is {2}"

将像这样填充

"your Add result  4 + 5 is 9"

但是如果你改变索引让我们说

"your Add result  {2} + {0} is {1}"

它会像这样

"your Add result  9 + 4 is 5"

如果您提供数组中不存在的string索引(例如{7}),则应用程序将崩溃,说明请求的索引(在本例中为7)是null。这将是System.FormatException

如果您尝试在大小为7元素的数组中获取索引4的值,那将是相同的。

答案 1 :(得分:1)

不,占位符需要一个从格式字符串后面的第一个参数索引的数字,从零开始。

因此Console.WriteLine("Hello, {0}!", "World")将打印"Hello, World!"Console.WriteLine("Hello, {1}!", "ignored", "World")将打印相同的内容。

您无法索引不存在的参数。

我想你想要改变每个操作的单词“Add”,而不必重复整个格式字符串。

你可以通过准备一个包含所有正确占位符的字符串来做到这一点,然后在适当的case块中分配它们:

string format = "Your {0} result is {1} {2} {3} = {4}";

string operation = "";
string symbol = "";
double result = 0;

switch(opt)
{
    case 'A':
        operation = "Add";
        symbol = "+";
        result = num1 + num2;
        break;
    case 'S':
        operation = "Subtract";
        symbol = "-";
        result = num1 - num2;
        break;
    break;
    ...
}

现在你可以打印整行:

string format = "Your {0} result is {1} {2} {3} = {4}";

...

Console.WriteLine(format, operation, num1, symbol, num2, result);

答案 2 :(得分:0)

简单地说,您不能为不存在的值提供格式化的说明符。例如:

Console.WriteLine("{1}", "test");

会抛出FormatException,因为只提供了一个参数(数组基于0)。

答案 3 :(得分:0)

不,你不能。语法糖是使用# lower-level module class CustomError(Exception): pass # in method Class Thing: def __init__(prop1): self.prop1 = prop1 def method(self,element): try: dependency.function(element,self.prop1) except ValueError as err: if str(err) == 'specific ValueError': raise CustomError else: raise # re-raise ValueError because string not recognized # back in higher-level module thing = lowerlevelmodule.Thing(prop1) for element in list_of_stuff: try: output = thing.method(element) except CustomError: output = None warnings.warn('set output to None for {} because CustomError'. format(element)) 。而且您仍然无法更改占位符的索引。他们总是从0开始