软件真谛

用水云般自在的禅心,书写诗情画意的程序人生...
posts - 24, comments - 942, trackbacks - 18, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 ::  :: 管理

输出自己源代码的C#程序

Posted on 2008-03-24 20:34 李战 阅读(13359) 评论(8)  编辑 收藏 所属分类: 软件思想
    今天是情人节,无聊中就把以前写的这个程序发一下:

class writeme{static void Main(){string s="class writeme{{static void Main(){{string s={0}{1}{0};System.Console.Write(s,(char)34,s);}}}}"; System.Console.Write(s,(char)34,s);}}

    有趣的是,这个C#程序编译运行后,又会在控制台中输出和自身一模一样的源代码。注意,输出自己的源代码确实是靠自身代码的运行而产生的。

    从逻辑学上说,自我包含往往会产生逻辑悖论,但这个程序却不会。

    你知道为什么吗?

李战(leadzen).深圳 2008-2-14

Feedback

#1楼    回复  引用  查看    

2008-02-24 18:29 by snryang      
System.Console.Write(s,(char)34,s)

把上面的"(char)34" 改成一个其它字符如:"@" 再将s改为其它字符如"cnblogs"再输出程序可以明白,

只是不知道为为什么字符"{{"输出的时候为什么变成了"{"

#2楼    回复  引用  查看    

2008-02-24 23:13 by deerchao      
@snryang
因为string.Format的第一个参数里'{'必须使用"{{"表示,以免与"{0}"这样的表达方式混淆.

#3楼    回复  引用    

2008-02-25 22:08 by air [未注册用户]
class C
{
static void Main()
{
string s = @"class C
{{
static void Main()
{{
string s = @{0}{1}{0};
System.Console.Write(s,(char)34,s);
}}
}}";
System.Console.Write(s,(char)34,s);
}
}

#4楼    回复  引用  查看    

2008-04-16 15:31 by 红色枫叶      
不错,收藏了.

#5楼    回复  引用  查看    

2008-04-19 13:51 by magiclee      
有意思o(∩_∩)o...

#6楼    回复  引用  查看    

2008-05-13 13:46 by 分享 共赢      
结束不了?
vista系统

#7楼    回复  引用  查看    

2008-05-21 10:38 by kun.zhang      
怎么解释呢?有点看不懂

#8楼    回复  引用    

2008-06-07 13:49 by 江水 [未注册用户]
是不是因为@符号?有了@就直接将类当字符串变量输出了