C# Web API中的静态方法。。。对还是错?

C# Web API中的静态方法。。。对还是错?,c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,我正在使用Visual Studio 2019编写一个asp.net web API。当我按照下面的示例编写时,VisualStudio建议我将该方法设置为静态。因此,我遵循这些建议,将Web API的所有方法都设置为静态。这是正确的吗?如果它是正确的,它的优点是什么?如果它是错误的,它的缺点是什么? 谢谢你 严重性代码说明项目文件行抑制状态 消息CA1822成员AdresleriGetir不访问实例数据,可以标记为静态(在VisualBasic中共享)Devriye.WebApi** 我的方法

我正在使用Visual Studio 2019编写一个asp.net web API。当我按照下面的示例编写时,VisualStudio建议我将该方法设置为静态。因此,我遵循这些建议,将Web API的所有方法都设置为静态。这是正确的吗?如果它是正确的,它的优点是什么?如果它是错误的,它的缺点是什么? 谢谢你

严重性代码说明项目文件行抑制状态 消息CA1822成员AdresleriGetir不访问实例数据,可以标记为静态(在VisualBasic中共享)Devriye.WebApi**

我的方法:

[HttpPost]
公共静态地址[]地址权限([FromBody]GirisParametresi GirisParametresi)
{
if(girisParametresi!=null)
{
字符串查询=@“从地址器中选择*,其中AKTIF=1”;
Cagri Cagri=新的Cagri()
{
Proje=“Devriye.WebApi”,
Modul=“AdresController”,
Metot=“AdresGetir”,
Nesne=新的JavaScriptSerializer().Serialize(girisParametresi)
};
Log Log=新日志(null,cagri,girisParametresi.Oturum);
使用(DataTable DataTable=DataAccessLayer.VerileriGetir(查询,null,日志))
{
List adresler=新列表();
如果(dataTable.Rows.Count>0)
{
for(int i=0;iDataAccessLayer.LogKaydet(log));}
尝试{adres.eklemetarihi=Convert.ToDateTime(dataTable.Rows[i][“eklemetarihi.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu 997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.ID=Convert.ToInt32(dataTable.Rows[i][“ID.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.Il=Convert.ToString(dataTable.Rows[i][“Il.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.Ilce=Convert.ToString(dataTable.Rows[i][“Ilce.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.KapiNo=Convert.ToString(dataTable.Rows[i][“KapiNo.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.Mahalle=Convert.ToString(dataTable.Rows[i][“Mahalle.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.PostaKodu=Convert.ToInt32(dataTable.Rows[i][“PostaKodu.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
尝试{adres.Sokak=Convert.ToString(dataTable.Rows[i][“Sokak.ToUpperInvariant()],WebApiConfig.CultureInfo);}catch(Exception ex){if(log!=null){log.Hata=new Hata(){Aciklama=ex.Message,HataKodu=997};Task.Run(()=>DataAccessLayer.LogKaydet(log));}
地址添加(adres);
}
返回地址ToArray();
}
其他的
{
返回null;
}
}
}
其他的
{
返回null;
}
}

此函数不访问任何实例数据或调用任何实例方法。 关于R#想要将这种类型的函数转换为静态函数,我也有过类似的问题。看到这个有一些原因。从链接中接受的答案

这让我问自己,所讨论的方法是否应该 是否属于该类型的一部分。因为它不使用任何实例数据,所以 至少应该考虑它是否可以移动到它自己的类型。它是 是该类型不可分割的一部分,还是真正的通用 实用方法

如果将方法保留在特定类型上是有意义的,那么 由于编译器将发出不同的代码,因此可能会提高性能 对于静态方法


请共享您的完整控制器代码。Visual Studio提供的信息错误,因为将有您的类的实例。但不是在你的代码中它将在框架中的某个地方创建,然后调用您的方法。因此,我建议恢复您的更改。但我相信你的代码还有更大的改进空间。就像其他人编写的共享控制器代码一样。这与问题完全无关,为什么有这么多的try-catch块都在做完全相同的事情?try-catch块用于捕获异常参数。我的问题与你的问题无关@对于MVC,操作不能是静态的。我有一个使用WebAPI2.0编写的RESTfull API,我通过代码分析查看了它。它表明我的一些动作是静态的。当我这样做的时候,动作路由最终调用了我的第一个动作,不管我传入了什么。所以它破坏了路由。我发现了这种艺术