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

时间:2018-12-12 04:53:45

标签: c# method-call

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

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的类方法,我可以在创建的Deck实例上调用它。这是我如何在程序中绘制Main方法的图片:

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

到目前为止,这里是类方法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的方法。有人可以指出我正确的方向吗?预先感谢。

3 个答案:

答案 0 :(得分:2)

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

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

这将帮助您根据需要调用随机播放

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

答案 1 :(得分:1)

首先,您可以按照以下步骤简化Deck类:

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();
    }

}

答案 2 :(得分:1)

DeckOfCards属性是该类的成员。类上的方法可以自动(隐式或通过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算法”。