• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

初学者遇到问题,求助

十里河畔 2021-05-01 09:51:19
直接上程序,程序很简单,问题出在红色字体处
结果只输出stringTest,没有输出enumeratorTest,不知为什么,请高人指点,小弟多谢!!!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Collections ;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
new test();
Console.ReadLine();
}
}
class test
{
private IEnumerator enumeratorTest;
private string stringTest;
public test ()
{
enumeratorTest = EnumeratorTest();
stringTest = StringTest();
}
private IEnumerator EnumeratorTest()
{
Console.WriteLine("enumeratorTest");
yield return "1";
}
private string StringTest()
{
Console.WriteLine("stringTest");
return "2";
}
}
}
...全文
108 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JDD1997 05-02
楼主的问题涉及到 IEnumerator 的工作方式, IEnumerator 即枚举器接口,其提供一些功能用于枚举一组元素,其具有延时执行的特性,

        public test()
        {
            //这里只是告诉了 enumeratorTest 如何执行,但并没有实际执行
            enumeratorTest = EnumeratorTest();
            stringTest = StringTest();
        }
修改一下,从 enumeratorTest 中取出其中的元素

        public test()
        {
            enumeratorTest = EnumeratorTest();

            //这里会导致 EnumeratorTest 执行到 yield return "1" 被执行,并停在 yield return "1" 
            enumeratorTest.MoveNext();
            var x = enumeratorTest.Current;
            Console.WriteLine($"enumeratorTest 的返回结果是:{x}");

            //这里会导致EnumeratorTest 接着 yield return "1" 后面执行到 yield return "2" 并停在 yield return "2"
            x = enumeratorTest.Current;
            Console.WriteLine($"enumeratorTest 的返回结果是:{x}");

            //不继续调用 enumeratorTest.MoveNext() 了
            //下面的 yield return "2" 后面的代码不会被执行

            stringTest = StringTest();
        }

        private IEnumerator EnumeratorTest()
        {
            Console.WriteLine("enumeratorTest 第一次运行");
            yield return "1";

            Console.WriteLine("enumeratorTest 第二次运行");
            yield return "2";

            Console.WriteLine("enumeratorTest 第三次运行");
            yield return "3";
        }
就像个牙膏,挤它才会有. 如果只是放在那里,它是不会主动出来的
回复
yield是不安全代码,要在项目属性中,把允许运行不安全代码,才会发挥作用。
回复
xuzuning 05-02
没有任何问题!
回复
写了另一段小程序继续测试,代码如下: 调试发现,返回枚举器的函数在调用的时候并不会执行,而是在使用MoveNext函数迭代返回的枚举器时才会执行 执行结果如图 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections ; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { test t = new test(); Console.WriteLine("********************"); Console.WriteLine(t.enumeratorTest.MoveNext()); Console.WriteLine(t.enumeratorTest.Current); Console.WriteLine(t.enumeratorTest.MoveNext()); Console.WriteLine(t.enumeratorTest.Current); Console.WriteLine(t.enumeratorTest.MoveNext()); Console.WriteLine(t.enumeratorTest.Current); Console.WriteLine(t.enumeratorTest.MoveNext()); Console.ReadLine(); } } class test { public IEnumerator enumeratorTest; private string stringTest; public test () { enumeratorTest = EnumeratorTest(); stringTest = StringTest(); } private IEnumerator EnumeratorTest() { Console.WriteLine("enumeratorTest-A"); yield return "A"; Console.WriteLine("enumeratorTest-B"); yield return "B"; Console.WriteLine("enumeratorTest-C"); yield return "C"; Console.WriteLine("enumeratorTest-D"); } public string StringTest() { Console.WriteLine("stringTest"); return "0"; } } }
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2021-05-01 09:51
社区公告

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