如何理解 C# 中的 System.Void 类型?

咨询区

  • ordag

我知道方法声明成 void 表示不返回什么东西,但我发现在 C# 中 void 不仅仅是一个关键词,而且还是一个真实的类型。

voidSystem.Void 的别名,就像 int 的别名是 System.Int32 一样,但为什么不允许直接使用Void类型呢?我觉得在逻辑上这是没有任何问题的。

比如说:

var nothing = new System.Void();

或者

var nothing = new void();

或者

void GiveMeNothing() { }
void GiveMeNothingAgain()
{
    return GiveMeNothing();
}

都是无法编译的,那请问 System.Void 到底场景在哪里呢?

回答区

  • Cheng Chen

void / System.Voidint / System.Int32 是不同的,它是一种特殊的结构体,仅用于 反射 场景中,比如下面的例子:

class Program
{
   public static void Main(string[] args)
   {
      Type voidType = typeof(Program).GetMethod("Main").ReturnType;
   }
}

在反射操作中,必须要有一种类型可以描述 Main 方法的返回值,这就是 System.Void 的应用场景。

  • Jon

根据 MSDN:https://docs.microsoft.com/en-us/dotnet/api/system.void?view=net-6.0 描述。

Void 结构落于 System.Reflection 命名空间,但在一般的程序开发中很少使用, Void 结构除了从 Object 上继承来的所有类型之外,无任何东西。

所以说,你没有任何理由需要在代码中像下面这样写。

var nothing = new void();
  • llewellyn falco

我们在代码中用 null 来替代 void 类型,代码如下:

public Type GetType(object o)
{
    var type = o == null ? typeof(void) : o.GetType();
}

这样就轻松实现了 空对象引用模型,也就省去了非常多的 空null 判断,非常方便,接下来就可以这么写:

GetType(o).GetProperties().Select( .....

点评区

我觉得 Cheng Chen 大佬说到点子上了,我们在反射操作中,比如要用 System.Void 来承载那些 void 类型的返回值,学习了。

4f2b061f0c56096e97bce3cde6247550.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java,你可以通过使用`javax.servlet.ServletContext`接口来实现类似于C#`System.Web.HttpContext.Current.Request.MapPath()`的功能。下面是一个示例代码: ```java import javax.servlet.ServletContext; public class MapPathExample { public static String mapPath(String path) { ServletContext context = ServletContextProvider.getServletContext(); // 通过Provider获取ServletContext对象 String realPath = context.getRealPath(path); // 获取真实路径 return realPath; } } class ServletContextProvider { private static ServletContext servletContext; public static void setServletContext(ServletContext context) { servletContext = context; } public static ServletContext getServletContext() { return servletContext; } } ``` 在你的Java Web应用程序的`web.xml`文件,你需要添加一个`ServletContextListener`来设置`ServletContext`对象。下面是一个示例`web.xml`文件的配置: ```xml <web-app> <!-- 其他配置 --> <listener> <listener-class>com.example.ServletContextListenerImpl</listener-class> </listener> </web-app> ``` 然后,你需要实现`ServletContextListener`接口,在`contextInitialized`方法设置`ServletContext`对象。下面是一个示例`ServletContextListener`的实现: ```java import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ServletContextListenerImpl implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext context = servletContextEvent.getServletContext(); ServletContextProvider.setServletContext(context); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { // 需要实现该方法,可以留空 } } ``` 现在,你可以在你的Java代码使用`MapPathExample.mapPath(path)`方法来获取路径的真实物理路径,就像在C#使用`System.Web.HttpContext.Current.Request.MapPath()`一样。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值