C#中如何获取对象实例大小

C#中如何获取对象实例大小,第1张

有点异想天开了。

C#提供了两个获取大小的方法

1使用sizeof运算符。但sizeof只有对int,byte等预定义值类型有效。

2使用SystemRuntimeInteropServicesMarshalSizeOf静态方法。此方法对任何值类型的实例有效。

除此之外,引用类型的内存是分配在堆上面的,不管是C,C++还是C#,好像都只能在堆上面实例化对象,删除对象。尤其是C#,连实例化/删除对象都有人代劳了。

如果你在堆上有你需要的信息,并且要把这段信息写入到磁盘等设备时,这时你需要对这个对象进行拆箱处理。这时你才获取到你拆箱后的对象实例的大小。

public void intialiseViewPager()

{

List<Fragment> fragments = new Vector<Fragment>();

numberOfTabs = applicationcurrentReportgetODTabsList()size();

for (int i = 0; i < numberOfTabs; i++)

{

ODTab tempTab = applicationcurrentReportgetODTabsList()get(i);

if (tempTabgetTabType()equals(ODGridXML_GRID_ELEMENT))

{

GridFragment gridFragment = GridFragmentnewInstance(tempTabgetTabId());

fragmentsadd(gridFragment);

}

else if (tempTabgetTabType()equals(ODChartXML_CHART_ELEMENT))

{

NewChartFragment chartFragment = NewChartFragmentnewInstance(tempTabgetTabId());

fragmentsadd(chartFragment);

}

}

Logd(TAG, "Current report fragments set to adapter: "+fragmentstoString());

mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments);

mViewPager = (ViewPager)findViewById(Ridpager);

mViewPagersetAdapter(mPagerAdapter);

mViewPagersetOffscreenPageLimit(0);

mViewPagersetOnPageChangeListener(this);

}

你可以看到我将字符串传递到片段 ( tempTabgetTabId() ),在这一行:

GridFragment gridFragment = GridFragmentnewInstance(tempTabgetTabId());

当片段中它自已我这样做对其进行初始化:

public static final GridFragment newInstance(String tabId)

{

GridFragment f = new GridFragment();

Bundle bdl = new Bundle(2);

bdlputString(TAB_ID, tabId);

fsetArguments(bdl);

return f;

}

@Override

public void onCreate(Bundle savedInstanceState)

{

String tabId = getArguments()getString(TAB_ID);

if (applicationcurrentReport != null)

{

thisodTab = applicationcurrentReportgetODTabByTabId(tabId);

}

else

{

startActivity(new Intent(getActivity(), LoginScrActivityclass));

}

superonCreate(savedInstanceState);

}

所有这一切被执行,不会覆盖默认空的构造函数的片段,按照我的理解这非常不建议。

现在我需要获取实例的 odTab 对象放进这行中的当前可见片段:

thisodTab = applicationcurrentReportgetODTabByTabId(tabId);

可能有些人请给我解释如何做到这吗?所以我可以把它的 odTab 对象,如何获取当前可见片段实例

更新:这里提出的意见与我加入了 odTab 到调用的应用程序类的对象实例 currentVisibleTab 和我设置 odTab 这样的实例:

@Override

public void setUserVisibleHint(boolean isVisibleToUser)

{

Logd(TAG, "setUserVisibleHint invoked!");

supersetUserVisibleHint(isVisibleToUser);

if (isVisibleToUser)

{

if (odTab != null && getActivity() != null)

{

Logd(TAG, "Currently visable tab: "+odTabgetTabTitle());

applicationcurrentVisibleTab = odTab;

}

}

}

更新 2:我有一种 ViewPagerAdapter :

public class ViewPagerAdapter extends FragmentPagerAdapter

{

private List<Fragment> fragments;

/

@param fm

@param fragments

/

public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {

super(fm);

thisfragments = fragments;

}

/ (non-Javadoc)

@see androidsupportv4appFragmentPagerAdapter#getItem(int)

/

@Override

public Fragment getItem(int position) {

return thisfragmentsget(position);

}

/ (non-Javadoc)

@see androidsupportv4viewPagerAdapter#getCount()

/

@Override

public int getCount() {

return thisfragmentssize();

}

@Override

public int getItemPosition(Object object) {

return POSITION_NONE;

}

public void removeAllFragments()

{

thisfragmentsclear();

}

public void addFragmentsListToAdapter(List<Fragment> fragments)

{

thisfragmentsaddAll(fragments);

}

public List<Fragment> getFragments()

{

return fragments;

}

}

在它正如你看到的我有 List 的片段所示的 ViewPager ,此列表初始化像这样:

List<Fragment> fragments = new Vector<Fragment>();

我不明白的是如何获取对当前段落触发从该列表中的接口方法的引用。不相关的问题,但也许你知道答案,有什么区别之间List 和 Vector

我还查阅了此选项。

先谢谢了。

解决方法 1:

我找到的方法 visbile 片段当前正在使用 setUserVisibleHint 和回视图寻呼机的接口。此方法是在类中片段。重写它和使用回叫您查看传呼机的接口。如果该片段是可见-即它返回 true-只使用对您片段 (无论是从列表中备份您的适配器或一个您存储为一个实例变量) 的引用以获取您需要的任何从片段本身。我已经添加下面的代码。

声明有关的无论你想做一个接口。我的情况我用这来禁用 ViewPager 默认 x 方向侦听器时一个谷歌地图实例是可见的因此滚动地图没有触发片段的变化。

public interface OnMapFragmetnVisibleListener{

public void mapVisible(boolean visible);

}

在片段:

@Override

public void onAttach(Activity activity){

superonAttach(activity);

try{

mapFragmentVisibilityListener = (OnMapFragmentVisibleListener) activity;

isAttached = true; //flag for whether this framgnet is attache to pager

} catch (ClassCastException e){

throw new ClassCastException(activitytoString() + " must implement interface onAttach");

}

@Override

public void setUserVisibleHint(boolean isVisibleToUser){

if(isVisibleToUser && isAttached){ //if listner is called before fragment is attached will throw NPE

mapFragmentVisibilityListenermapVisible(true);

}

}

直到我试过这个是不明显的一件事是 isAttached 变量的加法。我也重写片段 onAttach 方法,并将其设置为 true,一旦它被称为。否则会发生什么是您片段将对用户是可见的和尝试调用的接口向您 ViewPager 接口初始化之前。

在我 ViewPager 我只是实现了 OnMapFragmentVisibleListener,然后添加所需的方法

@Override

public void mapVisible(boolean visible) {

if(visible)

viewPagerallowSwipe(false); //turn off viewPager intercept touch if map visible

}

在我的案子我用它来关闭 ViewPager 刷功能但是,我可以轻松地叫回来的公共方法中我 mapFragment。我碰巧有 3 片段我 ViewPager 我保持对的引用

更新

要查找当前的片段首先显示你需要找出哪个片段正在显示你可以通过多种方式。最简单的方法就是通过一些描述符返回到您ViewPager / FragmentActivity 与您之前创建的接口。

public interface OnFragmentVisibleListener{

public void fragmentVisible(boolean true, String tag);

}

那您设置的问题是您正在使用 Vector ,是真的同步 List 来存储您片段 rerefences。其结果是,没有通过,你可以找到你片段以后的密钥值。片段有确定的一个标签,创建在片段获利的能力,它们被添加到该片段活动期间。然而,在 ViewPager设置,您没有添加片段分别,所以无法添加标签在获利。

我的解决方案一直是回我 BasePagerAdapter 与 HashMap 在其中存储由一个唯一的密钥标识每个片段。

LinkedHashMap<String, Fragment> tabs = new LinkedHashMap<String, Fragment>();

tabsput("Frag1", fragment1);

tabsput("Frag2", fragment2);

tabsput("Frag3", fragment3);

然后用此适配器

private class BasePagerAdapter extends FragmentPagerAdapter{

private LinkedHashMap<String, Fragment> tabs;

public BasePagerAdapter(LinkedHashMap<String, Fragment> tabMap, FragmentManager fm)

{

super(fm);

thistabs = tabMap;

}

// other basic methods

因为您的引用存储到一个密钥值、 容易找到因为你只是可以通过从键值哈希映射和返回键搜索你要找的 framgment。

如果您不能更改设置要逃离 Vector 你需要到任一 (1) 跟踪的哪个片段你添加的顺序 (假设片段不添加和删除动态) 这样,你可以通过对每个片段 (2) 保持单独引用或索引

private Fragment x;

//in onCreate

x = new Fragment();

//in interface

if(tagequals("x"){

xdoSomething();

}

因为在setup和composition API中没有this,则需要通过getCurrentInstance来获取当前组件实例,如果使用options API,则同vue2一样通过this,来获取当前组件实例

结果:

每一个class都有一个Class对象。一个java文件经过编译,再生成的class文件中,就会创建一个Class对象。只有一个。他表示整个类的类型信息。

那么通常我们创建对象的方式又有几种呢?

五种:

1通过new

语句创建对象。

2通过静态工厂方法创建,比如AgetNewInstance();

3通过反射技术来实现。可以调用Class类或Constructor类的newInstance()方法。

4通过调用对象的clone()方法

5利用I/O流技术的反序列化来实现。

回归正题获取Class对象(实例)有三种方法:

1通过class的方式创建Class实例:类名class

2通过对象的getClass()方法获得。

3通过Class类的forName()方法来获得。

反射:可以说是一中技术手段,利用反射可以访问,检测,修改本身行为状态的一种方式。利用反射我们可以创建实例。

其实质就是:反编译:class---反编译成java文件。

所以说他是一个强大的工具,他可以创建更加灵活的代码,在运行期装配。使我们可以在运行期,动态的访问对象有哪些方法,动态,并可以为修改对象的属性,在运行期动态的访问任何对象的任何方法。

而且他降低了代码的耦合度,提高了可扩展性。

但是反射使用不当会成本很高。而且反射本身比直接硬编码更加复杂,所以一般性小程序尽量不要用,他适合一些对灵活度和可扩展性比较强的框架中。

而且他会模糊程序结构,不利于理解程序流程。可维护性不好。

答案是 D、getConstructors()。

在 Java 中,通过有参构造方法实例化对象时,可以使用 Class 类的 getConstructors() 方法来获取要实例化的类中的全部构造方法。

Class 类是 Java 反射机制中的一个类,用于描述类的结构,如类的名称、成员变量、方法等。getConstructors() 方法可以获取类中的全部构造方法,并返回一个 Constructor 对象数组。

下面是一个示例代码,展示了如何使用 getConstructors() 方法获取一个类的全部构造方法:

class MyClass {

public MyClass() {}

public MyClass(int a) {}

public MyClass(String s) {}

}

Class cls = MyClassclass;

Constructor[] constructors = clsgetConstructors();

for (Constructor constructor : constructors) {

Systemoutprintln(constructor);

}

上面的代码定义了一个名为 MyClass 的类,并使用 getConstructors() 方法获取了 MyClass 类中的全部构造方法。最后,使用 for-each 循环遍历了所有的构造方法,并输出了每个构造方法的信息。运行结果如下:

public MyClass()

public MyClass(int)

public MyClass(javalangString)

估价师获取案例的方法有很多,以房地产估价师为例:

首先去现场了解下估价对象的具体实物跟区位状况,在附近转一转看看有没有类似房地产,看是出租的还是出售的比较多,选择估价方法,然后在中介打听下类似房地产的租金或者售价,有时间的话可以预约去看下房子。

至于其他空置率、报酬率之类的数据,需要请教下资深估价师,一般没有政策规定就是看估价师的经验了,如果是新手,由于这方面的资料相对不公开,难以查阅,只能是请教前辈,慢慢积累经验。

如果成交案例较多,收益法做出的结果也可以通过比较法进行验证,一般来说,选用的参数在正常范围内,计算过程没有问题,那得出的估价结果应该能经得起验证。

估价师资格证的注意事项:

鉴定估价师与估价员职业资格实行全国统一标准、统一命题、统一考务管理和统一证书。鉴定估价员的鉴定形式,由各省、自治区、直辖市、计划单列市及新疆生产建设兵团商务主管部门、劳动保障部门研究确定。

凡在旧货行业从事鉴定估价的人员,均可在自愿的基础上分别向中国旧货业协会和所在省(市)旧货业协会(尚未成立旧货协会的其工作暂时由商务主管部门承担)申报所要考试鉴定的等级。

百度百科-估价师

每个vue实例都是独立的,只能够通过id(ref或者创建时的返回值)来访问。

方法1 你这个组件可以独立起来,直接插入(不通过app组件)到dom中的指定位置。在拦截器的上级作用域定义,保证每次触发拦截器,访问到的是同一个实例

方法2 你把这个组件挂载到window对象上面

方法3 给loading定义id,通过样式控制

我用的方法3,不过加了请求数量控制(因为是直接挂载到app上面的,所以没有用try)

以上就是关于C#中如何获取对象实例大小全部的内容,包括:C#中如何获取对象实例大小、如何在 ViewPager 中获取当前可见fragment的实例、setup中如何获取组件实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9601730.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存