我不是面向对象编程的专家,我有一个愚蠢的问题:
class test {
public static function doSomething($arg) {
$foo = 'I ate your ' . $arg;
return $foo;
}
}
Run Code Online (Sandbox Code Playgroud)
所以调用doSomething()方法的正确方法是做test::doSomething('Pizza');,我是对的吗?
现在,如果我这样称呼会发生什么:
$test = new test;
$bar = $test->doSomething('Sandwich');
Run Code Online (Sandbox Code Playgroud)
我已经测试了它并且没有任何错误或通知等工作但是这样做是否正确?
在这两种情况之间,C#或其他语言如何处理内存分配(和内存解除分配):
1.)调用静态类的方法.
public Program {
Foo foo = Loader.load();
}
public static Loader {
public static Foo load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
2.)在一个实例上调用一个方法,然后该方法超出范围.
public Program {
Foo foo = new Loader().load();
}
public Loader {
public Foo load() {
return new Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
我想静态类在内存中被加载并保留; 而C#的闲暇时,类实例屈服于垃圾收集.这两种范式是否存在任何利弊?有没有时间你有一个永远不需要实例化的类(即某种资源加载器或工厂),但你还是使用第二种方法来利用垃圾收集?
我的问题的重要部分是,第一范式是否在某些情况下在概念上是正确的,可能会遭受不必要的记忆.
虽然我理解$this当在静态上下文中调用方法时该变量不可用,但为了帮助将我的应用程序组件彼此解耦,我认为从实例调用静态方法是有意义的.例如:
class MyExample{
private static $_data = array();
public static function setData($key, $value){
self::$_data[$key] = $value;
}
// other non-static methods, using self::$_data
}
// to decouple, another class or something has been passed an instance of MyExample
// rather than calling MyExample::setData() explicitly
// however, this data is now accessible by other instances
$example->setData('some', 'data');
Run Code Online (Sandbox Code Playgroud)
是否有计划弃用此类功能,或者我是否愿意期待对此的支持?我一起工作error_reporting(-1)以确保一个非常严格的开发环境,并且目前还没有任何问题(PHP 5.3.6)但是我知道反向变得不受支持; 也就是说,静态调用实例方法.
根据MSDN:
静态构造函数不接受访问修饰符或具有参数.
在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类.
无法直接调用静态构造函数.
任何人都可以解释为什么静态构造函数不能有参数.
我正在开发一个Web应用程序,每秒可以看到几十个并发用户.我有一个类将在同一页面加载中多次实例化.在那个类中,我有一些属性在每个对象中总是相同的,所以我正在考虑声明这些属性,static以减少在同一个类的多个实例被实例化时将使用的内存.页面请求.
这样做会为这个应用程序使用更少的内存,因为PHP只能存储一次静态属性的值吗?这样做会在并发用户之间节省内存,还是只在每个PHP进程中节省内存?
这对方法有何影响?如果这意味着对象可以循环使用相同的方法,那么为什么在尝试保存内存时,不会将类的所有方法都声明为静态?
我不清楚为什么以及何时会声明属性或方法是静态的,但我确实理解将它们声明为静态允许在不实例化类的对象的情况下访问它们(这感觉就像一个黑客...这些方法和属性应该在其他地方......不是吗?).我特别感兴趣的是static声明影响内存使用的方式,以便在我的网络服务器上尽可能降低内存使用率......总的来说,我对发生的事情有了更好的理解.
我问,因为我试图使用一个模拟框架(Mockito),它不允许你模拟静态方法.调查一下我发现有不少博客文章说你应该尽可能少的静态方法,但是我很难理解为什么.特别是为什么不修改全局状态的方法基本上是辅助方法.例如,我有一个名为ApiCaller有几个静态方法的类.静态方法的一个目的是执行HTTP调用,处理我们的服务器可能返回的任何自定义问题(例如用户未登录)并返回响应.为了简化,例如:
public class ApiCaller {
...
public static String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用这一切,我所要做的就是调用ApiCaller.makeHttpCall(url)
Now我可以很容易地将它变为非静态方法,如:
public class ApiCaller {
...
public String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用此方法调用,new ApiCaller().makeHttpCall()但这似乎是额外的开销.任何人都可以解释为什么这是坏的,如果有一个更好的解决方案使方法非静态(除了删除关键字),以便我可以使用模拟框架存根这些方法?
谢谢!
我在静态类中有以下静态方法.我的问题是在静态方法中使用HttpContext.Current.Response是否安全?我想100%确定它是线程安全的,并且只与调用线程相关联.有人知道答案吗?
public static void SetCookie(string cookieName, string cookieVal, System.TimeSpan ts)
{
try
{
HttpCookie cookie =
new HttpCookie(CookiePrefix + cookieName)
{Value = cookieVal, Expires = DateTime.Now.Add(ts)};
HttpContext.Current.Response.Cookies.Add(cookie);
}
catch (Exception)
{
return;
}
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下示例代码:
#include <array>
struct MyClass
{
size_t value = 0;
constexpr static size_t size() noexcept
{
return 3;
}
};
template <size_t N>
void DoIt()
{
MyClass h;
std::array<int, h.size()> arr;
}
int main()
{
DoIt<1>();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用GCC 7.3.0编译它时,我得到一个关于h在非constexpr上下文中不可用的错误:
cexpr.cpp: In function ‘void DoIt()’:
cexpr.cpp:17:26: error: the value of ‘h’ is not usable in a constant expression
std::array<int, h.size()> arr;
^
cexpr.cpp:16:11: note: ‘h’ was not declared ‘constexpr’
MyClass h;
^
cexpr.cpp:17:27: error: the value of ‘h’ is not usable …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET Web应用程序中的公共类中声明了很少的全局方法.
我习惯以下列格式在公共类中声明所有全局方法
public static string MethodName(parameters) { }
Run Code Online (Sandbox Code Playgroud)
我想知道它会如何影响性能观点?
http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244指出:
因为,静态方法使用锁是线程安全的.始终在内部执行Monitor.Enter()和Monitor.exit()以确保线程安全.
虽然http://dotnetperls.com/static-method声明:
静态方法在调用堆栈上调用通常比实例方法更快.在C#编程语言中有几个原因.实例方法实际上使用'this'实例指针作为第一个参数,因此实例方法将始终具有该开销.实例方法也使用中间语言的callvirt指令实现,这会产生轻微的开销.请注意,将方法更改为静态方法不太可能对雄心勃勃的性能目标有所帮助,但它可以帮助一点点,并可能导致进一步减少.
我很困惑哪一个使用?
我想写es6类:
class SomeClass {
static prop = 123
method() {
}
}
Run Code Online (Sandbox Code Playgroud)
如何获得访问静态prop从method()没有使用SomeClass明确?在es6中它可以完成this.constructor,但是在打字稿中this.constructor.prop导致错误" TS2339:属性'道具'在类型'函数'上不存在 ".
static-methods ×10
c# ×4
php ×3
.net ×2
this ×2
android ×1
c++ ×1
c++14 ×1
constexpr ×1
deprecated ×1
httpcontext ×1
java ×1
memory-leaks ×1
mockito ×1
oop ×1
performance ×1
typescript ×1