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'.
使用 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'.