gpt4 book ai didi

c# - 我应该多久检查一次参数的有效性?

转载 作者:行者123 更新时间:2023-11-30 20:56:16 26 4
gpt4 key购买 nike

我经常遇到类似的架构问题。应该多久检查一次输入参数的有效性?让我们检查以下示例(不要关心代码的正确性或可编译性):

public void DoSth()
{
context.DbPerform((SQLiteConnection connection) =>
{
// *** 1 ***
if (connection == null)
throw new ArgumentNullException("connection");
if (!connection.IsOpen)
connection.Open();

try
{
Data.Insert(data, connection);
}
finally
{
connection.Close();
}
});
}

// ----

public static void Insert(Data data, SQLiteConnection connection)
{
// *** 2 ***

if (data == null)
throw new ArgumentNullException("data");
if (connection == null)
throw new ArgumentNullException("connection");

if (!connection.IsOpen)
connection.Open();

try
{
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = SQL.InsertData;

FillParameters(data, connection, cmd);

cmd.ExecuteNonQuery();
}
}
finally
{
connection.Close();
}
}

// ----

public static void FillParameters(Data data,
SQLiteConnection connection,
SQLiteCommand cmd)
{
// *** 3 ***
if (connection == null)
throw new ArgumentNullException("connection");

// And so on, you get the idea
}

在前面的代码片段中,已检查连接是否为空或已关闭 3 次。这对我来说似乎有点矫枉过正——有时 50% 的方法主体是安全检查。我觉得不需要那么多安全检查,但另一方面总是有人可以使用这些方法,我不确定他是否传递了有效参数。

所以我的问题是:

  • 应该多久对传递的参数进行一次安全检查?
  • 可以使用哪些技术来保持安全级别,但无需经常进行安全检查?
  • 检查无效输入时我应该多疑?考虑另一个例子:
class C
{
private Obj obj;

public C (Obj newObj)
{
if (newObj == null)
throw new ArgumentNullException("newObj");

obj = newObj;
}

public void DoSth()
{
// Should I check, whether obj is not null?
}
}

最佳答案

关于第一个示例,Insert() 中的检查是个好主意,因为 Insert()public。它可以从另一个没有进行检查的上下文中调用。

通常,始终在公共(public)接口(interface)点进行验证。这有助于使您的代码松耦合和可重用。

每一层(层、方法)都有自己的要求。因此,在任务开始时验证您需要执行某项任务的内容。

关于c# - 我应该多久检查一次参数的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17650117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com