我有类似以下代码:
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部分.这个错误的代码仍然在我们的生产环境中按预期工作.
怎么会这样?这些编写的代码没有理由按照预期工作; 然而它确实如此,并且仍然在生产中.什么会改变,使这个代码不应该工作,但做了,突然停止工作(或者更确切地说,表现得像它应该有的)?
我有一个表达式,我在几个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.FromUser或Message.ToUser基于该布尔值.
如果用户正在查看他/她的发件箱,sent则为真,并且会看到是否x.FromUser.Username == username和x.SenderDeleted == false.
如果用户正在查看他/她的收件箱,那么它会执行相同的逻辑,但是发送是错误的,而是检查x.ToUser而x.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) 我是一个全新的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属性之前已经适当更改了.
我在这里失踪了什么?为什么按钮只是在我硬编码的两个字符串之间切换文本框文本值?
我想知道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) 我首先学习了Java,其中一个绝对是你永远不会使用==来比较两个字符串是否相等,而是使用equals方法.因此,当我多年前登陆C#并注意到对象仍然使用Equals方法时,我认为规则仍然适用.
现在我正在通过一个前同事的代码,我发现这样的片段到处都是:
if (s.Substring(0, s.IndexOf("_")) == "GBCI") {...}
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,==将比较这两个结果之间的地址,并且由于函数返回了前半部分,这将失败,因为结果与右边的常量不同.
我是否坚持旧的Java习惯?或者我的同事不在身边是一件好事吗?
PS无论你对比较字符串的答案如何,我都会意识到上面会更好地说明s.BeginsWith("GBCI"),但这完全是另一回事.
我知道在c#中你可以将字符串与==和equals进行比较,但我想知道根据最佳实践我需要使用什么.请注意,我需要知道String和string是否相同
我用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".
我的问题是:为什么我不能将这两个字符串与==运算符进行比较?
有时在两个字符串之间的条件下,我写道:
if(string1==string2) //Do something
Run Code Online (Sandbox Code Playgroud)
有时我会写:
if(string1.Equals(string2)) //Do something
Run Code Online (Sandbox Code Playgroud)
问题是有时第一个不起作用,或者错误,这两个表达式之间有什么区别吗?
此函数始终返回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# ×9
string ×3
.net ×2
.net-4.5 ×1
asp.net ×1
c#-4.0 ×1
class ×1
expression ×1
foreach ×1
function ×1
iequatable ×1
if-statement ×1
lambda ×1
linq ×1
null ×1