c# 如何将变量从方法传递到 main?

标签 c# .net

我正在学习 C#,我正在创建一个询问用户名字的程序,如果第一个字母没有大写,程序会自动将其大写,我想将其放入一个方法中,但在返回值时遇到了问题从方法进入 Main 方法。

这是我正在尝试的代码

using System;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {

        //Method for letter capitalisation 
        static string capitalise(string userName, char letter) { //users name, letter being replaced
            letter = char.ToUpper(letter); //capitalise first letter
            StringBuilder sb1 = new StringBuilder(userName);
            sb1.Remove(0, 1); //removes first letter
            sb1.Insert(0, letter); //inserts first letter from letter object
            userName = sb1.ToString(); //writes string builder into string
            return userName; //returns method value to the object
        }
        static void Main(string[] args)
        {
            string firstName;
            string lastName;

            Console.WriteLine("What is your First Name?");
            firstName = Console.ReadLine();
            Console.WriteLine("What is your Last Name?");
            lastName = Console.ReadLine();

            char capitalFirst = firstName[0]; // writes first letter of the name as a char
            if (char.IsLower(capitalFirst)) { //checks if char is lowercase 
                capitalise(firstName, capitalFirst); //calls for method and writes parameters
                firstName = capitalise(userName); // <--- here i am trying to write the user first name as a result from the capitalise method

            }

            //Same for last name...

            Console.WriteLine(firstName + " " + lastName);

错误:用户名在当前上下文中不存在

最佳答案

你真的想多了。

正如提到的其他答案和评论,您的问题是可变范围。在这种情况下,“范围”是指声明变量并因此可访问的代码块。

在括号对 ({, }) 内声明的任何变量只能在该对内访问。该区域称为 block 。方法参数 - 如示例中的 usernameletter 只能在方法体内访问,也可以方便地用大括号分隔。

例如,这是有效的:

{
  string s;
  s = "blah;
  Console.WriteLine(s);
}

虽然这不是

{
    string s;
    s = "blah"
}
Console.WriteLine(s); // s has gone out of scope and does not exist here.

在您的示例中,存在许多问题。您以两种不同的方式调用 capitalise,其中一种 - 只有一个参数,而该方法需要两个参数 - 是无效的。 但是,眼前的问题是:

firstName = capitalise(userName);

userName 在这里无效,因为它是 capitalize 的参数。 MainuserName 一无所知,因为它是在不同的作用域中声明的。

可能的意思是:

firstName = capitalise(firstName, capitalFirst);

下面是完整的工作示例。在这种情况下,使用 StringBuilder 是矫枉过正且不必要的。 StringBuilder 通常在需要通过连接一堆东西来构建非常大的字符串时使用。字符串连接需要一些分配和复制,并可能触发垃圾收集器,这可能会严重影响性能,并且在极端情况下会消耗大量内存。

祝你好运!

using System;

public class Program
{

    public static string Capitalize(string s)
    {
        if(string.IsNullOrEmpty(s))
            return string.Empty;

        string result = char.ToUpper(s[0]) + s.Substring(1);

        return result;
    }

    public static void Main()
    {
            string firstName;
            string lastName;

            Console.WriteLine("What is your First Name?");
            firstName = Console.ReadLine();
            Console.WriteLine("What is your Last Name?");
            lastName = Console.ReadLine();

            firstName = Capitalize(firstName);
            lastName = Capitalize(lastName);
            Console.Write("Hello, {0} {1}.", firstName, lastName);
    }
}

关于c# 如何将变量从方法传递到 main?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59866267/

相关文章:

c++ - 从另一个函数更改表单 "visible"属性?

c# - 构建/运行针对已安装 .Net 4 或 .Net 4.5 的 .Net 4 的应用程序之间有什么区别吗?

c# - 在 XmlDocument 中加载 xml 文件时出错

c# - 如何在 C# 中修复无法表示的 DateTime

c# - 为什么我的 XAML 代码没有运行?

c# - 如何在 Unity 中使用 mesh.bounds?

javascript - Knockoutjs 模板文件和本地化 resx 文件

c# - Windows 服务如何在引发计时器事件时启动进程?

c# - VS 2017 RC 在尝试调试 xUnit 测试时生成 0x8000ffff 错误

c# - 从 GridView 中删除列