在if语句中分配的字符串的范围

时间:2015-11-17 02:45:53

标签: c# model-view-controller

来自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语句中使用字符串pullUserName = yadda yadda分配了pullUserName ...并且它给了我一个波形,说它不在正确的范围内,所以如果我" Dim&#34 ; (是的,我知道,在C#问题中的VB术语)它在if语句之上,它工作正常。所以两部分问题, 1:这真的是这样的,还是我错过了什么? 2:这对我来说似乎很笨拙有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:4)

就个人而言,我会重新整理一些更整洁的东西......

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 coalescing operator,如果它不为null,则返回第一个值,否则返回正确的值。 ?.称为null-conditional,如果username为空,则返回null,否则返回username.UserName值。

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

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