相关疑难解决方法(0)

可能的意外参考比较按预期工作

我有类似以下代码:

this.Session[key] = "foo";

if ((this.Session[key] ?? string.Empty) == "foo")
{
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

当然,这会产生"可能的非预期参考比较按预期工作"的情况.这里有很好的解决方案,我已经知道修复是在string看到代码后立即将会话变量转换为a .

但是,代码已有多年历史,并且自最初编写以来从未更改过.直到本周在我们的测试环境中,if语句被评估为true并执行了该//do stuff部分.这个错误的代码仍然在我们的生产环境中按预期工作.

怎么会这样?这些编写的代码没有理由按照预期工作; 然而它确实如此,并且仍然在生产中.什么会改变,使这个代码不应该工作,但做了,突然停止工作(或者更确切地说,表现得像它应该有的)?

c# asp.net .net-4.5

6
推荐指数
1
解决办法
286
查看次数

我怎么能清理这个lambda?

我有一个表达式,我在几个LINQ查询中使用了几次,所以我把它分成了它自己的返回表达式的方法.函数的lambda部分看起来很乱.任何人都想破解重构并使其更具可读性和/或更小?

    private Expression<Func<Message, bool>> UserSelector(string username, bool sent)
    {
        return x => ((sent ? x.FromUser : x.ToUser).Username.ToLower() == username.ToLower()) && (sent ? !x.SenderDeleted : !x.RecipientDeleted);
    }
Run Code Online (Sandbox Code Playgroud)

它正在做的快速英文描述是检查布尔值sent并检查Message.FromUserMessage.ToUser基于该布尔值.

如果用户正在查看他/她的发件箱,sent则为真,并且会看到是否x.FromUser.Username == usernamex.SenderDeleted == false.

如果用户正在查看他/她的收件箱,那么它会执行相同的逻辑,但是发送是错误的,而是检查x.ToUserx.RecipientDeleted不是.

也许这是最简单的方法,但我对一些重构持开放态度.

答案编辑

我真的很喜欢Davy8的答案,但我决定更进一步,用一个嵌套函数做两个表达式而不是一个表达式.现在我有以下方法:

    /// <summary>
    /// Expression to determine if a message belongs to a user.
    /// </summary>
    /// <param name="username">The name of the user.</param>
    /// <param name="sent">True if retrieving sent …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda linq-to-entities expression

5
推荐指数
1
解决办法
234
查看次数

if按钮中的语句c#

我是一个全新的n00bie in visual c#,我遇到了一个奇怪的障碍,让我疯狂!这是有问题的代码(是的,Hello World程序):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            if (textBox1.Text.Equals("Goodbye Cruel World"))
            {
                textBox1.Text = ("Hello World!");

            }
            else { textBox1.Text = ("Goodye Cruel World"); }


        }



    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用textBox1.Text =="再见残酷的世界"; 作为if语句的评估参数在编译器中没有错误(顺便说一句,我使用的是Visual Studio 2012 Ultimate)

程序运行正常.我将文本框文本属性初始化为"Hello World!" 使用VS的设计GUI.我面临的问题是代码仅在用户第一次单击按钮时才起作用.按钮没有任何时候.

我调试了代码,并确保在用户第一次单击按钮时适当更改了文本框文本属性.当用户第二次(或在此之后的任何时间)点击该按钮时,一旦代码到达if语句,它就会跳过它,就好像其中的表达式的评估是FALSE一样.事实上,跟上调试工具,按钮一直只执行else块中的代码,即使我知道我正在使用的TextBox.Text属性之前已经适当更改了.

我在这里失踪了什么?为什么按钮只是在我硬编码的两个字符串之间切换文本框文本值?

c# c#-4.0

5
推荐指数
2
解决办法
234
查看次数

对于CLR类型,Object.Equals(objA,objB),objA.Equals(objB)和objA == objB之间的区别?

我想知道CLR类型是否会返回以下不同的结果:

Object.Equals(objA, objB)

objA.Equals(objB)

(objA == objB)
Run Code Online (Sandbox Code Playgroud)

我确实意识到在CLR之外有人可以轻松地实现IEqualtableEquals并且不正确地重载==运算符.我不关心那些不正当地实施这些的人.我所关注的是类(包括String,Int32等)以不同的方式实现这3个.

此外,如果可能的话,哪一个应该是用于整体比较的(全面).我想知道这是因为我遇到了一个文件,它使用Object.Equals(objA, objB)了整个视图模型而不是其他两个.

private string _name;
public string Name
{
    get { return _name; }
    set
    {
        if (Equals(_name, value)) return;
        ...
    }
}

private int _id;
public int Id
{
    get { return _id; }
    set
    {
        if (Equals(_id, value)) return;
        ...
    }
}

private Object _obj;
public Object TheObject
{
    get { return _obj; }
    set
    {
        if (Equals(_obj, value)) return;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# iequatable equals-operator object-equality

4
推荐指数
1
解决办法
717
查看次数

C#字符串比较?

可能重复:
使用==或等于字符串比较
string.Equals()和==运算符是否真的相同?

我首先学习了Java,其中一个绝对是你永远不会使用==来比较两个字符串是否相等,而是使用equals方法.因此,当我多年前登陆C#并注意到对象仍然使用Equals方法时,我认为规则仍然适用.

现在我正在通过一个前同事的代码,我发现这样的片段到处都是:

if (s.Substring(0, s.IndexOf("_")) == "GBCI") {...}
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,==将比较这两个结果之间的地址,并且由于函数返回了前半部分,这将失败,因为结果与右边的常量不同.

我是否坚持旧的Java习惯?或者我的同事不在身边是一件好事吗?

PS无论你对比较字符串的答案如何,我都会意识到上面会更好地说明s.BeginsWith("GBCI"),但这完全是另一回事.

c# string

3
推荐指数
1
解决办法
606
查看次数

比较字符串的最佳做法

可能重复:
string.Equals()和==运算符是否真的相同?

我知道在c#中你可以将字符串与==和equals进行比较,但我想知道根据最佳实践我需要使用什么.请注意,我需要知道String和string是否相同

c#

3
推荐指数
1
解决办法
5009
查看次数

以两种不同的方式比较两个字符串

我用C#编写了这个小程序

private void Form1_Load(object sender, EventArgs e)
{
    MessageBox.Show(("7797302D875A8922EBFC7DECBD352FE88F35642F" == "?7797302D875A8922EBFC7DECBD352FE88F35642F").ToString());

    var a = "7797302D875A8922EBFC7DECBD352FE88F35642F";
    var b = "7797302D875A8922EBFC7DECBD352FE88F35642F";
    MessageBox.Show((a == b).ToString());

}
Run Code Online (Sandbox Code Playgroud)

第一个messageBox显示"False",而Messagebox显示"True".

我的问题是:为什么我不能将这两个字符串与==运算符进行比较?

c# string

1
推荐指数
1
解决办法
94
查看次数

String1.Equals(string2)和string1 == string2 C#之间的区别

可能重复:
C#:String.Equals vs. ==
string.Equals()和==运算符是否真的相同?

有时在两个字符串之间的条件下,我写道:

if(string1==string2) //Do something
Run Code Online (Sandbox Code Playgroud)

有时我会写:

if(string1.Equals(string2)) //Do something
Run Code Online (Sandbox Code Playgroud)

问题是有时第一个不起作用,或者错误,这两个表达式之间有什么区别吗?

.net c# string if-statement

0
推荐指数
1
解决办法
4551
查看次数

函数总是返回null?

此函数始终返回null.sString是一个带有字符串"Name"和字符串"Value"值的类.不要问我为什么不使用常规字符串 - 这很复杂.这是我的功能:

static string Get_sString(string VarName, ref List<sString> VarList)
{
    foreach (sString TestsString in VarList)
    {
        if (TestsString.Name == VarName)
        {
            return TestsString.Name;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

它应该返回具有与VarName相同的Name值的实例,并且它可以工作,除了if语句总是为false.我无法弄清楚为什么.我实际上有一个几乎相同的类,叫做sDecimal,唯一的区别是Value属性是十进制,而不是字符串.Get_sDecimal()与此完美匹配,Get_sDecimal()和Get_sString()之间的唯一区别是,一个测试sDecimal,一个测试sString. 谢谢!

编辑:这是sString类.

class sString
{
    public string Name;
    public string Value;

    /// <summary>
    /// String Value variables that may have the same name.
    /// </summary>
    /// <param name="n">Internal name of variable.</param>
    /// <param name="v">Value of variable.</param>
    public sString(string n, string v)
    {
        Name = n;                    
        Value = v; …
Run Code Online (Sandbox Code Playgroud)

c# foreach null class function

0
推荐指数
1
解决办法
172
查看次数