在if语句中指定的字符串的作用域

本文关键字:字符串 作用域 if 语句 | 更新日期: 2023-09-27 18:22:06

来自VB,这对我来说很奇怪,所以我相信有更好的方法。。。

string pulledUserName = ""; // To allow the pulledUserName to be usable in the var result line below ? Really?  If's have their own scope in C#?
            if (await UserManager.FindByNameAsync(model.Email) == null)
            {
                var user = await UserManager.FindByEmailAsync(model.Email);
                if (user != null)
                {
                    pulledUserName = user.UserName;
                }
            }
            else
            {
                var user = await UserManager.FindByNameAsync(model.Email);
                 pulledUserName = user.UserName;
            }

            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, change to shouldLockout: true
            var result = await SignInManager.PasswordSignInAsync(pulledUserName, model.Password, model.RememberMe, shouldLockout: false);

在我的第一次循环中,我在IF语句中指定了pulled UserName,字符串为pulled UserName=yadda-yadda。。。它给了我一个歪歪扭扭的词,说它不在正确的范围内,所以如果我在if语句上方"Dim"(是的,我知道,C#问题中的VB术语),它就可以正常工作。因此,由两部分组成的问题,1:这真的是这样吗?还是我遗漏了什么?2:这在我看来很笨拙,有更好的方法吗?

在if语句中指定的字符串的作用域

就我个人而言,我会重构成更整洁的东西。。。

var username = await UserManager.FindByNameAsync(model.Email) ??
               await UserManager.FindByEmailAsync(model.Email);
var pulledUserName = username?.UserName;
var result = await SignInManager.PasswordSignInAsync(pulledUserName,
                                                     model.Password, 
                                                     model.RememberMe, 
                                                     shouldLockout: false);

??运算符被称为null合并运算符,如果它不是null,它将返回第一个值,否则它将返回正确的值。?.被称为null条件,如果username为null,则返回null,否则将返回username.UserName值。

在尝试将pulledUserName传递给登录管理器之前,检查它是否为null可能很重要,但这很简单。

不过,为了直接回答您的问题,scope在c#中的工作方式与在VB中的相同。您不能使用在当前作用域之外定义的变量,所以是的,这就是它的工作方式。解决方法是构建代码,这样就可以避免创建不必要的作用域。在C#中,{和},即使在if语句的上下文中,也定义了一个新的作用域。