【问题标题】:Calling function in yet uninstanced object C#在尚未实例化的对象 C# 中调用函数
【发布时间】:2016-09-20 17:15:28
【问题描述】:

我正在尝试为我的简单应用创建菜单。我想使用 switch,但我找不到在应用程序启动时实例化的非实例类中调用函数的方法。

class Window
{
    public void startLibrary(int sizeX, int sizeY)
    {
        BookList MainLibrary = new BookList();
        this.mainMenu();
    }

    public void mainMenu()
    {
        string userChoice = Console.ReadLine();
        switch  (userChoice)
        {
            case "1":

                break;

在案例 1 中如何调用 MainLibrary 的函数。这里显然没有实例化,但我找不到将引用传递给未实例化对象的方法。

书目代码:

class BookList
{
    List<Book> books = new List<Book>();       
    public void addBook() // adding book
    {
        string name = Console.ReadLine();
        string author = Console.ReadLine();
        int relDate = int.Parse(Console.ReadLine());
        int uID = books.Count() + 1;
        books.Add(new Book(name, author, relDate, uID));
    }
    public void deleteBook() // deleting book
    {
        int readForDelete = int.Parse(Console.ReadLine());
        books.RemoveAll(Book => Book.UniqueID == readForDelete);
    }
    public void borrowBook() // borrowing book
    {
        int readForBorrow = int.Parse(Console.ReadLine());
        foreach (Book Book in books)
        {
            if (Book.UniqueID == readForBorrow)
                Book.available = false;
        }
    }
    public void returnBook() // returning book
    {
        int readForReturn = int.Parse(Console.ReadLine());
        foreach (Book Book in books)
        {
            if (Book.UniqueID == readForReturn)
                Book.available = true;
        }
    }
    public void displayBooks() // displaying list of books
    {
        string isAvailable;
        foreach (Book Book in books)
        {
            if (Book.available == true)
                isAvailable = "available";
            else
                isAvailable = "unavailable";
            Console.WriteLine(" {0} {1} {2} {3} {4} ", Book.UniqueID, Book.BookName, Book.BookName, Book.ReleaseDate, isAvailable);
        }
    }
    public string Name
    {
        get; set;
    }
}

}

【问题讨论】:

  • 我不确定我是否理解这个问题,但也许您可以将引用作为参数传递给您的 mainMenu 函数。
  • 你不能传递不存在的东西的引用。引用对象实例。

标签: c# oop object


【解决方案1】:

您要么需要将 BookList 实例传递给 mainMenu() 方法,要么设置一个全局变量。我推荐前者。

public void mainMenu(BookList list) { ... }

然后从startLibrary这样调用它:

this.mainMenu(MainLibrary);

附带说明,您确实需要brush up on your variable, class, and method naming conventions

【讨论】:

  • 谢谢你,完美的作品和我想要的方式。我的命名约定真的很可悲,但我仍在努力学习这些。我想命名的主要问题是字段中的 PascalCasing。不是吗?
【解决方案2】:

你可以用这样的 lambdas 来实现它:

class Window
{
    public void startLibrary(int sizeX, int sizeY)
    {
        BookList MainLibrary = new BookList();
        Action<BookList> action = this.mainMenu();
        if (action != null)
        {
            action(MainLibrary);
        }
    }

    public Action<BookList> mainMenu()
    {
        string userChoice = Console.ReadLine();
        switch (userChoice)
        {
            case "1":
                return b => b.addBook();
        }

或者您可以将对 MainLibrary 变量的引用传递给方法:

class Window
{
    public void startLibrary(int sizeX, int sizeY)
    {
        BookList MainLibrary = new BookList();
        this.mainMenu(MainLibrary);
    }

    public Action<BookList> mainMenu(BookList b)
    {
        string userChoice = Console.ReadLine();
        switch (userChoice)
        {
            case "1":
                b.addBook();
                break;
        }

【讨论】:

  • 第二种解决方案创造了奇迹!十分感谢。您能否解释一下return b =&gt; b.addBook()Action 部分?我不知道那里发生了什么。我对 C# 和编码本身真的很陌生。提前谢谢你:)
  • 第一个例子有错误。我刚刚更正了。
  • 很难用几句话来解释 lambda 和动作...也许这篇文章有帮助:growingwiththeweb.com/2012/08/func-and-action-basics-in-c.html - 或者只是在谷歌上搜索“C# action lambda”
  • @Easy 啊,所以BookList的实例实际上实例化的,你需要在另一个方法中使用它。
【解决方案3】:

首先,您在 startLibrary 方法中得到的是一个局部变量 - 只能在定义它的块内访问。也就是说,MainLibrary 不是您可以从其他任何地方引用的东西。 要解决您的问题,您有多种选择。 您可以使 MainLibrary 成为 Window 类的字段/成员。然后 Window 类的所有实例方法都可以访问它 - 就像 MainMenu 方法一样:

class Window
{
    private BookList MainLibrary;

    public void startLibrary(int sizeX, int sizeY)
    {
        this.MainLibrary = new BookList();
        this.mainMenu();
    }

    public void mainMenu()
    {
        string userChoice = Console.ReadLine();
        switch  (userChoice)
        {
            case "1":
                // do whatever you want with this.MainLibrary here
                break;
            /// ...
        }
    }
}

另一个选项是将您创建的 MainLIbrary 实例传递给 mainMenu 方法。在这里,您需要更新方法的签名,如下所示:

public void mainMenu(BookList list)
{
    // reference the list now as necessary
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多