我正在用C#创建一个应用程序.它的作用是评估给定是否为素数以及相同的交换数是否为素数.
当我在Visual Studio中构建我的解决方案时,它说"非静态字段,方法或属性需要对象引用......".我对"volteado"和"siprimo"方法有这个问题.
问题在哪里,我该如何解决?
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Write a number: ");
long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user
long av = volteado(a); // av is "a" but swapped
if (siprimo(a) == false && siprimo(av) == false)
Console.WriteLine("Both original and swapped numbers are prime.");
else
Console.WriteLine("One of the numbers isnt prime.");
Console.ReadLine();
}
private bool siprimo(long a)
{
// Evaluate if the received number is prime
bool sp = true;
for (long k = 2; k <= a / 2; k++)
if (a % k == 0) sp = false;
return sp;
}
private long volteado(long a)
{
// Swap the received number
long v = 0;
while (a > 0)
{
v = 10 * v + a % 10;
a /= 10;
}
return v;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Igb*_*man 64
您无法从静态方法访问非静态成员.(注意这Main()是静态的,这是.Net的要求).只需将static关键字放在它们前面,就可以使siprimo和volteado静态化.例如:
static private long volteado(long a)
Run Code Online (Sandbox Code Playgroud)
sha*_*zia 33
创建一个类并将所有代码放在那里,并从Main调用此类的实例:
static void Main(string[] args)
{
MyClass cls = new MyClass();
Console.Write("Write a number: ");
long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user
long av = cls.volteado(a);
bool isTrue = cls.siprimo(a);
......etc
}
Run Code Online (Sandbox Code Playgroud)
mjv*_*mjv 21
只需添加static这两个方法的声明,编译时错误就会消失!
默认情况下,C#方法是实例方法,它们接收隐式的"self"参数.通过使它们成为静态,不需要(也不可用)这样的参数,并且该方法当然必须避免访问该类的任何实例(非静态)对象或方法.
有关静态方法的更多信息
如果类和方法的访问修饰符(公共与私有)都可以,则可以从任何地方调用静态方法,而无需事先实例化类的实例.换句话说,静态方法使用以下语法:
className.classMethod(arguments)
rather than
someInstanceVariable.classMethod(arguments)
Run Code Online (Sandbox Code Playgroud)
在System.Math类中可以找到静态方法的经典示例,我们可以在其中调用一堆这样的方法
Math.Sqrt(2)
Math.Cos(Math.PI)
Run Code Online (Sandbox Code Playgroud)
没有实例化"数学"类(实际上我甚至不知道这样的实例是否可行)
| 归档时间: |
|
| 查看次数: |
186747 次 |
| 最近记录: |