为什么要在运行时检查(求解释)

lulianqi 2016-01-10 01:37:36


public void TestJa(object[] myObjs)
{
if (myObjs!=null)
{
if(myObjs.Length>0)
{
myObjs[0] = 123;
}
}
// do nothing
}

这样掉用 TestJa(new string[] { "1","2","3"});



这个方法有明显的错误,很容易识别,.NET 为什么不在编译时检查,非要在运行时检查这个错误。
有什么内情么,求解释
...全文
184 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南小鱼 2016-01-11
  • 打赏
  • 举报
回复
List<object>的形参,你传string[]值,不让你过,这是合情合理,有什么耿耿于怀的呢?! List<>和数组是两码事~
lulianqi 2016-01-11
  • 打赏
  • 举报
回复
引用 6 楼 wddw1986 的回复:
写成List<T>编译为什么不通过你好好看看人家编译器给你的提示,别一厢情愿。
引用 7 楼 lovelj2012 的回复:
List<object>的形参,你传string[]值,不让你过,这是合情合理,有什么耿耿于怀的呢?! List<>和数组是两码事~
怪我没有说清楚 太跳跃了,既然换List<object>,我当然参数也会换成 new List<string>() { "1", "2", "3" } 这种形式了。
cheng2005 2016-01-11
  • 打赏
  • 举报
回复
写成List<T>编译为什么不通过你好好看看人家编译器给你的提示,别一厢情愿。
  • 打赏
  • 举报
回复
”.NET 为什么不在编译时检查,非要在运行时检查这个错误“,说白了,就是遇到了不责任而仅仅追求“万能参数类型”的编程骚年了。
  • 打赏
  • 举报
回复
object 是弱类型,它造成的有关的性能是其次,最主要地是弱类型本身就是无法在编译时保证类型检查的,只能在运行时进行类型检查(并且崩溃在用户面前)。 这已经不错了。如果你用c++等坑爹的,它们通常在运行时也不做类型检查,会带着完全诡异了的内存状态而继续带毒运行,知道碰到底层崩溃的底线才停止。而.net 可以在运行时及时进行类型和边界值的检查,这虽然有一点性能代价,但是对大多数人开发的软件来说,其稳定性要好过c++程序许多。 但是根本上来说,应该使用强类型编程风格,尽量避免滥用object类型声明。
lulianqi 2016-01-10
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
object 是弱类型,它造成的有关的性能是其次,最主要地是弱类型本身就是无法在编译时保证类型检查的,只能在运行时进行类型检查(并且崩溃在用户面前)。

这已经不错了。如果你用c++等坑爹的,它们通常在运行时也不做类型检查,会带着完全诡异了的内存状态而继续带毒运行,知道碰到底层崩溃的底线才停止。而.net 可以在运行时及时进行类型和边界值的检查,这虽然有一点性能代价,但是对大多数人开发的软件来说,其稳定性要好过c++程序许多。

但是根本上来说,应该使用强类型编程风格,尽量避免滥用object类型声明。


引用 2 楼 lovelj2012 的回复:
1、形参是object类型的数组,所以调用时传string、object、自定义类等等类型的数组,无论编译还是运行,这个都是符合规则的。object海纳百川。
2、基于第一条,所以只有等到运行时,才知道数组元素能不能赋int类型的值。下面的代码运行是ok的,你能说TestJa方法有明显的错误么?

object[] oa = new object[] { 2, 3 };
TestJa(oa);




也是醉了,CSDN非要说上面回复内容含有非法词组,不过写了这么多字不回也很不甘心,我只好在预览里截图了
江南小鱼 2016-01-10
  • 打赏
  • 举报
回复
1、形参是object类型的数组,所以调用时传string、object、自定义类等等类型的数组,无论编译还是运行,这个都是符合规则的。object海纳百川。 2、基于第一条,所以只有等到运行时,才知道数组元素能不能赋int类型的值。下面的代码运行是ok的,你能说TestJa方法有明显的错误么?

object[] oa = new object[] { 2, 3 };
            TestJa(oa);
cheng2005 2016-01-10
  • 打赏
  • 举报
回复
引用
很容易识别
你确定真的很容易识别?你用眼睛看确实挺好识别,因为这些逻辑都存在了你的脑子里,问题是计算机不编译运行怎么识别?语法分析是没法找到这种错误的,即使有检查的办法,那也不如编译运行更简单。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧