Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的Ping在不是第一个方法时返回null_C# - Fatal编程技术网

C#中的Ping在不是第一个方法时返回null

C#中的Ping在不是第一个方法时返回null,c#,C#,我显然是C#的新手,对Powershell也有一些经验,但这一点让我感到困惑 我需要创建一个ping主机的方法,如果它收到回复,就向它发送一些Telnet命令,但是我被ping回复卡住了 如果我创建了该方法并将其作为命名空间中的唯一方法,或者至少是主方法,那么它的行为与预期的一样,并返回预期的结果 这项工作: 只要我想向同一名称空间添加其他方法,ping就会返回一个“null”值 这行不通 我肯定我错过了一些简单的东西,如果有人能解释为什么它在不是主菜单时返回空值,我非常感谢您的帮助!谢谢你对新

我显然是C#的新手,对Powershell也有一些经验,但这一点让我感到困惑

我需要创建一个ping主机的方法,如果它收到回复,就向它发送一些Telnet命令,但是我被ping回复卡住了

如果我创建了该方法并将其作为命名空间中的唯一方法,或者至少是主方法,那么它的行为与预期的一样,并返回预期的结果

这项工作:

只要我想向同一名称空间添加其他方法,ping就会返回一个“null”值

这行不通


我肯定我错过了一些简单的东西,如果有人能解释为什么它在不是主菜单时返回空值,我非常感谢您的帮助!谢谢你对新来的家伙的耐心

在第二个示例中,有两个类都有一个名为Main()的静态函数

这些行(来自第二个版本)

创建PingTruck的实例,但不要将该实例分配给任何对象,然后检查名为PingStatus的类PingTruck的静态属性。在PingTruck.Main()中运行代码是不可能的

最简单的解决方案是更换

new PingTruck();      

但是,最好将PingTruck中的静态内容更改为实例内容(Main(),但将其称为其他内容,如掺杂()和PingStatus)。然后,在程序中执行类似的操作


您需要PingTruck类的一个实例

class Program
{
    public static void Main(string[] args)
    //I'm thinking the below should run the PingTruck method and set the variable PingStatus,
    //then write it's status to the console, but it returns a null value.
    {   
        pingTruck =  new PingTruck();      
        Console.WriteLine(pingTruck.PingMethod);
        Console.ReadLine();
    }
}
静态
Main
方法适用于console类。要使用另一个类,只需使用另一个公共类即可

public class PingTruck
{
    public string PingStatus;
    public string PingMethod()
    {
        string IPAddress = "127.0.0.1";
        int timeout = 7;

        try
        {   Ping Truck = new Ping();
            PingReply reply = Truck.Send(IPAddress, timeout);

            if (reply.Status == IPStatus.Success)
                return PingStatus = "Found Truck";
            else
                return PingStatus = "Can't Find Truck";
        }
        catch (PingException)
        {
            return PingStatus = "No Truck";
        }
    }
}

调用
PingTruck.Main(字符串[]args)
方法时

如果
PingTruck
只有
Static
成员,为什么要创建它的实例

最简单的解决方案是:

PingTruck.Main(args);
Console.WriteLine(PingTruck.PingStatus);
Console.ReadLine();

但是,我强烈建议您检查代码设计。

您创建对象的实例(尽管您从未对它做过任何操作):

但实际上,您从未调用执行任何操作的方法。相反,您只需立即检查状态:

Console.WriteLine(PingTruck.PingStatus)
由于从未调用逻辑,因此状态从未设置为任何值。因此它是
null
的默认值

只需调用该方法:

PingTruck.Main(args);
Console.WriteLine(PingTruck.PingStatus);
还请注意,不需要对象的实例,因为方法和状态值都是静态的


还要注意的是,这段代码有一些不一定有意义的东西。虽然它可能“起作用”,但它肯定可以得到清理和澄清

例如,您的
PingTruck
类不需要所有内容都是静态的。如果删除
静态
修饰符,则将在实例上使用成员:

var truck = new PingTruck();
truck.Main(args);
Console.WriteLine(truck.PingStatus);
此外,您的
PingTruck.Main()
方法可能应该命名为其他名称。可能是类似于Ping()的东西。
Main
并没有真正描述该方法的实际功能

该方法似乎也不需要
args
参数,因为它从不使用它

(您似乎觉得应用程序中的所有方法都需要命名为
Main(string[]args)
,并且必须是
static
。我向您保证,事实并非如此。)

设置公共属性和返回值也没有多大意义。为什么不直接返回值呢?例如:

return "Found Truck";
然后在消费代码中:

var truck = new PingTruck();
Console.WriteLine(truck.Ping());

你从来没有真正使用过平车。。。Main(ArbitraryStringArrayHere)将填充PingStatus属性。。。
new PingTruck()
Console.WriteLine(PingTruck.PingStatus)
PingTruck.Main(args);
Console.WriteLine(PingTruck.PingStatus);
var truck = new PingTruck();
truck.Main(args);
Console.WriteLine(truck.PingStatus);
return "Found Truck";
var truck = new PingTruck();
Console.WriteLine(truck.Ping());