C#有更好的写作方式吗?

Tom*_*len 8 c# asp.net readability

int uploadsID;
int pageNumber;
int x;
int y;
int w;
int h;

bool isValidUploadID = int.TryParse(context.Request.QueryString["uploadID"], out uploadsID);
bool isValidPage = int.TryParse(context.Request.QueryString["page"], out pageNumber);
bool isValidX = int.TryParse(context.Request.QueryString["x"], out x);
bool isValidY = int.TryParse(context.Request.QueryString["y"], out y);
bool isValidW = int.TryParse(context.Request.QueryString["w"], out w);
bool isValidH = int.TryParse(context.Request.QueryString["h"], out h);

if (isValidUploadID && isValidPage && isValidX && isValidY & isValidW & isValidH)
{
Run Code Online (Sandbox Code Playgroud)

这是一个ajax处理程序,检查所有传递的参数是否正常.这被认为是坏的,是否有更好的方法来写这个,或者它不是那么重要?

Jon*_*eet 7

假设您不打算在bool其他地方使用单个变量,您可以将其写为:

int uploadsID, pageNumber, x, y, w, h;
if (int.TryParse(context.Request.QueryString["uploadID"], out uploadsID) &&
    int.TryParse(context.Request.QueryString["page"], out pageNumber) &&
    int.TryParse(context.Request.QueryString["x"], out x) &&
    int.TryParse(context.Request.QueryString["y"], out y) &&
    int.TryParse(context.Request.QueryString["w"], out w) &&
    int.TryParse(context.Request.QueryString["h"], out h))
{
}
Run Code Online (Sandbox Code Playgroud)

你可能想要提取出int.TryParse(context.Request.QueryString[name], out variable一个单独的方法,给你一些类似的东西:

int uploadsID, pageNumber, x, y, w, h;
if (TryParseContextInt32("uploadID", out uploadsID) &&
    TryParseContextInt32("page", out pageNumber) &&
    TryParseContextInt32("x", out x) &&
    TryParseContextInt32("y", out y) &&
    TryParseContextInt32("w", out w) &&
    TryParseContextInt32("h", out h))
{
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用TryParse方法将所有此上下文数据封装到新类型中,因此您可以使用以下内容:

PageDetails details;
if (PageDetails.TryParse(context.Request.QueryString))
{
    // Now access details.Page, details.UploadID etc
}
Run Code Online (Sandbox Code Playgroud)

这显然是更多的工作,但我认为它会使代码更清晰.


Ben*_*jol 6

是的,首先将您分解int.TryParse(etc.)为一个单独的功能.

(可能受F#过度影响)

//return a tuple (valid, value) from querystring of context, indexed with key
private Tuple<bool, int> TryGet(HttpContext context, string key)
{
    int val = 0;
    bool ok = int.TryParse(context.request.QueryString[key], out val);
    return Tuple.New(ok, val);
}
Run Code Online (Sandbox Code Playgroud)

然后:

var UploadId = TryGet(context, "uploadID");
//...
if(UploadId.Item1 && etc..) 
{
    //do something with UploadId.Item2;
Run Code Online (Sandbox Code Playgroud)

为了使事情更清晰,你可以

private class ValidValue
{
    public bool Valid { get; private set; }
    public int Value { get; private set; }
    public ValidValue(bool valid, int value)
    { 
        Valid = valid;
        Value = value;
    }
    //etc., but this seems a bit too much like hard work, and you don't get 
    // equality for free as you would with Tuple, (if you need it)
Run Code Online (Sandbox Code Playgroud)