c# 如何编写可以在 class 的实例上调用的 class 方法

c# how to code a class method that can be called on the instance of the class

使用 c# .net 4.7.1 我有一个名为 Deck 的 class,代码如下:

public class Deck
{
    public Card[] DeckOfCards { get; private set; } = new Card[56];        

    public Deck()
    {
        DeckOfCards = NewDeck();
    }

    private Card[] NewDeck()
    {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }
}

我想在 Deck 中声明一个名为 Shuffle 的 class 方法,我可以调用我创建的 Deck 的实例。这是我在我的程序中描绘我的 Main 方法的方式:

class program
{
    static void Main(string[] args)
    {
        Deck WorkingDeck = new Deck();
        WorkingDeck.DeckOfCards.Shuffle();
        ....
    }
}

到目前为止,我对 class 方法 Shuffle 的了解如下:

    public Card[] Shuffle(this Card[] DeckToShuffle)
    {
        Random rnd = new Random();
        Card[] ShuffledDeck = DeckToShuffle.OrderBy(x => rnd.Next()).ToArray();
        return ShuffledDeck;
    }

但这需要我在方法调用中传递 Card[]。我希望该方法使用 WorkingDeck.DeckOfCards 作为被洗牌的 Deck。有人可以指出我正确的方向来做到这一点吗?提前致谢。

首先,您可以将 Deck class 简化如下:

public class Deck {

    public Card[] DeckOfCards { get; private set; } = NewDeck();

    private static Card[] NewDeck() {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }
}

如果你想 Shuffle 改变你 Deck 中卡片的顺序,你可以写一个扩展方法,像这样:

static class DeckExtensions {

    public static void Shuffle(this deck)
    {
        Random rnd = new Random();
        deck.DeckOfCards = deck.DeckOfCards.OrderBy(x => rnd.Next()).ToArray();
    }

}

在这种特殊情况下,扩展方法将是一个很好的解决方案。

public static class Extensions
{
    public static void Shuffle(this IEnumerable<Card> source)
    {
        // Body of Shuffle
    }
}

这将帮助您根据需要调用 shuffle

Deck WorkingDeck = new Deck();
WorkingDeck.DeckOfCards.Shuffle();

DeckOfCards属性是class的成员。 class 上的方法可以自动访问其成员(隐式或通过 this 关键字)。

public class Deck
{
    public Card[] DeckOfCards { get; private set; };        

    public Deck()
    {
        this.DeckOfCards = NewDeck();
    }

    static Card[] NewDeck()
    {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }

    public void Shuffle()
    {
        Random rnd = new Random();
        Card[] shuffledDeck = this.DeckOfCards.OrderBy(x => rnd.Next()).ToArray();
        this.DeckOfCards = shuffledDeck;
    }
}

您可以这样调用它:

static void Main(string[] args)
{
    Deck workingDeck = new Deck();
    workingDeck.Shuffle();
    ....
}

此设计将 Deck 作为可变对象:Shuffle 改变现有牌组的顺序,而不是创建不同的牌组。

顺便说一句,有更好的洗牌方法可以使用。 Google 这里的术语是 'Fisher-Yates algorithm'.